文章目錄
-
-
- 基本原理
- pytorch是如何操作的
-
基本原理
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI2EzX4xSZz91ZsAzNfRHLGZkRGZkRfJ3bs92YsAjMfVmepNHLth3VapHbYJmZKNjYtljVaJDbHJWQClGVF5UMR9Fd4VGdsATNfd3bkFGazxycykFaKdkYzZUbapXNXlleSdVY2pESa9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLhhjN4IzMlFjM5YTOhBTOhdjMlRTY0kTZwATZiFjN3M2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
pytorch是如何操作的
- 在了解cross entropy之前先了解下NLLLoss, 就是Negative Log Likelihood Loss
- 輸入端是softmax經過log之後的值,不過這裡要注意,y可以是one-hot形式,也可以是是單純的數像[2, 3, 4]這種
- CrossEntropyLoss就是把以上Softmax–Log–NLLLoss合并成一步, 也就是說, CrossEntropyLoss的預測值可以是線性層直接和标簽值算損失
下面程式需要注意的點:
1. 正确率計算中的max, 也有argmax, max第一個是數, 第二個是索引, 0是對行做, 1 是對列做, 1做完了後次元是batch, 也就是行的次元
2. 還有這個(perd==labels).sum()可以學習下
3. dataloader是如何疊代的(元組)
4. 用CNN特征圖變小, 那麼通道得變多
import torch
import torchvision
import torch.nn as nn
batch_size = 128
num_workers = 2
# 先對資料相關的資料進行設定
learning_rate = 0.001
num_epoches = 200
train_data = torchvision.datasets.MNIST(root='./dataset/mnist', train=True, download=True, transform=torchvision.transforms.ToTensor())
train_loader = torch.utils.data.DataLoader(train_data, batch_size=batch_size, shuffle=True)
test_data = torchvision.datasets.MNIST(root='./dataset/mnist', train=False, download=True, transform=torchvision.transforms.ToTensor())
test_loader = torch.utils.data.DataLoader(test_data, batch_size=batch_size, shuffle=False)
class NN(nn.Module):
def __init__(self, input_dim, output_dim):
super(NN, self).__init__()
self.linear = nn.Sequential(
nn.Linear(input_dim, 50),
nn.ReLU(),
nn.Linear(50, output_dim)
)
def forward(self, x):
x = x.reshape(x.shape[0], -1)
x = self.linear(x)
return x
Linear_model = NN(784, 10)
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(Linear_model.parameters(), lr=learning_rate)
def accuracy(epoch, loader, model):# 檢查總的正确率
num_correct = 0
num_samples = 0
model.eval()
for x, y in loader:
x = x
y = y
scores = model(x)
_, pred = scores.max(1) # 注意max和argmax
num_correct += (pred==y).sum()
num_samples += pred.shape[0]
correct = (num_correct/num_samples)*100
print('batch:{}, correct:{}'.format(epoch, correct))
model.train()
if __name__ == '__main__':
for epoch in range(num_epoches):
for index, (image, labels) in enumerate(train_loader):
y_pre = Linear_model(image)
loss = criterion(y_pre, labels)
optimizer.zero_grad()
loss.backward()
optimizer.step()
accuracy(epoch, test_loader, Linear_model)