网络结构:前面的是线性层+sigmoid激活层,最后一层是Softmax层
Softmax的公式为如下:
Softmax的损失函数-YlogY_pred
code
import numpy as np y = np.array([1,0,0]) z = np.array([0.2,0.1,-0.1]) y_pred = np.exp(z)/np.exp(z).sum() loss = (-y*np.log(y_pred)).sum() print(loss)
torch自带交叉熵损失API,在最后一层线性层后就不要做激活。
code
import torch criterion = torch.nn.CrossEntropyLoss() Y=torch.LongTensor([2,0,1]) y_pred1=torch.Tensor([[0.1,0.2,0.9], [1.1,0.1,0.2], [0.2,2.1,0.1]]) y_pred2=torch.Tensor([[0.8,0.2,0.3], [0.2,0.3,0.5], [0.2,0.2,0.5]]) loss1 = criterion(y_pred1,Y) loss2 = criterion(y_pred2,Y) print('loss1=',loss1,'nloss2=',loss2)图像数据如何转化为向量
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z1EHCsAs-1644032532692)(https://gitee.com/chenhao_ANTHONY/mapdepot1/raw/master/img/202202051006838.png)]
该图像的每一个像素点是0-255的一个数值,像素越暗,数值越小,将这些数值/255,归一化到[0,1]区间,0表示黑,1表示白,得到一个28*28的矩阵
交叉熵包含:
Softmax:即 数值/(数值和)
log:对得到的分数占比x计算 e^x
-YlogY_pred:带入公式计算,求和得到loss
code:
import numpy as np import torch from torchvision import transforms from torchvision import datasets from torch.utils.data import DataLoader import torch.nn.functional as F import torch.optim as optim batch_size = 64 transform = transforms.Compose([ transforms.ToTensor(), #将图像转为tensor向量,且取值为0-1 transforms.Normalize((0.1307,),(0.3081,)) #第一个是均值,第二个是标准差,需要提前算出,这两个参数都是mnist的 ]) train_dataset = datasets.MNIST(root='../dataset/mnist', train = True, download=True, transform=transform) train_loader = DataLoader(train_dataset, shuffle=True, batch_size=batch_size) test_dataset = datasets.MNIST(root='../dataset/mnist', train = False, download=True, transform=transform) test_loader = DataLoader(test_dataset, shuffle=False, batch_size=batch_size) class Net(torch.nn.Module): def __init__(self): super(Net, self).__init__() self.linear1 = torch.nn.Linear(784,512) self.linear2 = torch.nn.Linear(512,256) self.linear3 = torch.nn.Linear(256,128) self.linear4 = torch.nn.Linear(128,64) self.linear5 = torch.nn.Linear(64,10) def forward(self,x): x = x.view(-1,784) #-1表示代码会自动运算,当输入N张图片时,系统会将像素/784得到N x = F.relu(self.linear1(x)) x = F.relu(self.linear2(x)) x = F.relu(self.linear3(x)) x = F.relu(self.linear4(x)) x = self.linear5(x) #最后一层要接入softmax 所以不做激活 return x model = Net() #交叉熵包含 softmax 再求对数 criterion = torch.nn.CrossEntropyLoss() #momentum表示 optimizer = optim.SGD(model.parameters(),lr=0.01,momentum=0.5) def train(epoch): running_loss = 0.0 for batch_idx,data in enumerate(train_loader,0): inputs,target = data optimizer.zero_grad() outputs = model(inputs) loss = criterion(outputs,target) loss.backward() optimizer.step() running_loss += loss.item() if batch_idx % 300 == 299: print('[%d,%5d] loss: %.3f'%(epoch+1, batch_idx+1, running_loss/300)) running_loss = 0.0 def test(): correct = 0 total = 0 with torch.no_grad(): #接下来的代码块中不会计算梯度 for data in test_loader: images,labels = data outputs = model(images) #dim=0 表示列的下标和最大值,dim=1 表示行的下标和最大值 _,predicted = torch.max(outputs.data,dim=1) total += labels.size(0) correct += (predicted == labels).sum().item() print('labels:',labels,'noutputs:',outputs,'n_:',_,'npredicted:',predicted) print('Accuracy on test set:%d %%'%(100*correct/total)) if __name__ == '__main__': for epoch in range(10): train(epoch) test()
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)