Python과 PyTorch에서 0차원 토치 텐서에 값 할당하기
방법 1: torch.tensor() 함수 사용하기
import torch
# 숫자 5를 사용하여 0차원 텐서 생성
scalar_tensor = torch.tensor(5)
# 텐서에 값 할당
scalar_tensor.item() = 10
print(scalar_tensor) # 출력: tensor(10)
방법 2: 직접 값 할당하기
import torch
# 0을 할당하여 0차원 텐서 생성
scalar_tensor = torch.zeros(1)
# 텐서에 값 10 할당
scalar_tensor[0] = 10
print(scalar_tensor) # 출력: tensor(10)
방법 3: 기존 텐서를 사용하여 생성하기
import torch
# 1차원 텐서 생성
one_dim_tensor = torch.tensor([1, 2, 3])
# 1차원 텐서의 첫 번째 값을 사용하여 0차원 텐서 생성
scalar_tensor = one_dim_tensor[0]
# 텐서에 값 15 할당
scalar_tensor.item() = 15
print(scalar_tensor) # 출력: tensor(15)
참고:
scalar_tensor.item()
함수는 0차원 텐서의 값을 Python 스칼라 값으로 변환합니다.- 텐서에 값을 할당할 때 텐서의 데이터 형식과 할당하려는 값의 데이터 형식이 일치하는지 확인해야 합니다.
추가 정보
예제 코드: MNIST 이미지 분류
이 코드는 다음을 수행합니다.
- MNIST 데이터 세트 로드
- 신경망 모델 정의
- 손실 함수 및 최적화 알고리즘 정의
- 모델 학습
- 모델 평가
import torch
import torchvision
import torch.nn as nn
import torch.optim as optim
# 장치 설정
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
# MNIST 데이터 세트 로드
train_dataset = torchvision.datasets.MNIST(root='./data', train=True, download=True, transform=torchvision.transforms.ToTensor())
test_dataset = torchvision.datasets.MNIST(root='./data', train=False, download=True, transform=torchvision.transforms.ToTensor())
# 데이터 로더 생성
train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=64, shuffle=True)
test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=64, shuffle=False)
# 신경망 모델 정의
class Net(nn.Module):
def __init__(self):
super().__init__()
self.conv1 = nn.Conv2d(1, 6, 5)
self.pool1 = nn.MaxPool2d(2)
self.conv2 = nn.Conv2d(6, 16, 5)
self.pool2 = nn.MaxPool2d(2)
self.fc1 = nn.Linear(16 * 4 * 4, 120)
self.fc2 = nn.Linear(120, 10)
def forward(self, x):
x = self.pool1(self.conv1(x))
x = self.pool2(self.conv2(x))
x = x.view(-1, 16 * 4 * 4)
x = self.fc1(x)
x = self.fc2(x)
return x
model = Net().to(device)
# 손실 함수 및 최적화 알고리즘 정의
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.001)
# 모델 학습
for epoch in range(10):
running_loss = 0.0
for i, data in enumerate(train_loader, 0):
# 데이터를 모델로 보내 출력 계산
inputs, labels = data
inputs = inputs.to(device)
labels = labels.to(device)
outputs = model(inputs)
loss = criterion(outputs, labels)
# 손실 계산 및 역전파
optimizer.zero_grad()
loss.backward()
optimizer.step()
# running loss 계산
running_loss += loss.item()
if i % 2000 == 1999:
print('Epoch %d/%d, step %d, loss: %.3f' % (epoch + 1, 10, i + 1, running_loss / 2000))
running_loss = 0.0
# 모델 평가
model.eval()
with torch.no_grad():
correct = 0
total = 0
for data in test_loader:
images, labels = data
images = images.to(device)
labels = labels.to(device)
outputs = model(images)
_, predicted = torch.max(outputs.data, 1)
total += labels.size(0)
correct += (predicted == labels).sum().item()
print('Accuracy of the network on the 10000 test images: %d %%' % (100 * correct / total))
0차원 PyTorch 텐서에 값을 할당하는 대체 방법
In-place 연산 사용하기
import torch
scalar_tensor = torch.tensor(5)
# 텐서에 직접 10을 더하여 값 할당
scalar_tensor += 10
print(scalar_tensor) # 출력: tensor(15)
특수 함수 사용하기
import torch
scalar_tensor = torch.tensor(5)
# fill_() 함수를 사용하여 텐서의 모든 값을 10으로 채움
scalar_tensor.fill_(10)
print(scalar_tensor) # 출력: tensor(10)
NumPy 배열 사용하기
import torch
import numpy as np
# NumPy 배열 생성
array = np.array(10)
# NumPy 배열을 사용하여 0차원 텐서 생성
scalar_tensor = torch.from_numpy(array)
print(scalar_tensor) # 출력: tensor(10)
주의 사항:
- 위의 대체 방법 중 일부는 특정 상황에서만 작동할 수 있습니다. 예를 들어,
+=
연산자는 텐서와 숫자만 더할 수 있지만,fill_()
함수는 모든 데이터 형식의 텐서에 사용할 수 있습니다.
python pytorch