PyTorch 教程-图像识别中神经网络的实现
我们的下一个任务是使用先前标记的图像来训练神经网络,以对新的测试图像进行分类。因此,我们将使用nn模块来构建我们的神经网络。
实现图像识别神经网络的步骤如下:
步骤1:
from torch import nnclass classifier (nn.Module):
def __init__(self,input_layer,hidden_layer1,hidden_layer2,output_layer):
步骤2:
super(),__init__()self.linear1=nn.Linear(input_layer,hidden_layer1)self.linear2=nn.Linear(hidden_layer1,hidden_layer2)self.linear3=nn.Linear(hidden_layer2,output_layer)def __init__(self,input_layer,hidden_layer1,hidden_layer2,output_layer):
👉点击领取:最全Python资料合集
步骤3:
import torch.nn.functional as funcdef forward(self,x):
现在,传递给forward()函数的任何输入将传递给linear1对象,我们将使用relu函数而不是sigmoid。这个输出将作为输入传递到我们的第二隐藏层,并且第二隐藏层的输出将馈送到输出层,并返回最终层的输出。
注意:如果我们处理的是多类别数据集,就不会在输出层应用任何激活函数。
x=func.relu(self.linear1(x))x=func.relu(self.linear2(x))x=self.linear3(x)return x
步骤4:
在下一步中,我们将设置我们的模型构造函数。根据我们的初始化器,我们必须设置输入维度、隐藏层维度和输出维度。
model=classification1(784,125,65,10)
步骤5:
criteron=nn.CrossEntropyLoss()
optimizer=torch.optim.Adam(model.parameters(),lr=0.001)
步骤6:
loss_history=[]correct_history=[]
步骤7:
for e in range(epochs):for input, labels in training_loader:
步骤8:
当我们迭代图像的批次时,我们必须将它们展平,并使用view方法进行形状变换。
注意:每个图像张量的形状是(1,28,28),这意味着总共有784个像素。
inputs=input.view(input.shape[0],-1)
outputs=model(inputs)
步骤9:
loss1=criteron(outputs,labels)optimizer.zero_grad()loss1.backward()optimizer.step()
步骤10:
loss+=loss1.item()
epoch_loss=loss/len(training_loader)loss_history.append(epoch_loss)
步骤11:
在接下来的步骤中,我们将找到网络的准确性。我们将初始化正确的变量并赋值为零。我们将比较模型对每个训练图像的预测与图像的实际标签,以显示在一个epoch中有多少个预测是正确的。
_,preds=torch.max(outputs,1)
步骤12:
correct+=torch.sum(preds==labels.data)
epoch_acc=correct.float()/len(training_loader)print('training_loss:{:.4f},{:.4f}'.format(epoch_loss,epoch_acc.item()))
步骤13:
plt.plot(loss_history,label='Running Loss History')plt.plot(correct_history,label='Running correct History')
完整代码
import torchimport matplotlib.pyplot as pltimport numpy as npimport torch.nn.functional as funcfrom torch import nnfrom torchvision import datasets, transformstransform1=transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.5,),(0.5,))])training_dataset=datasets.MNIST(root='./data',train=True,download=True,transform=transform1)training_loader=torch.utils.data.DataLoader(dataset=training_dataset,batch_size=100,shuffle=True)def im_convert(tensor):image=tensor.clone().detach().numpy()image=image.transpose(1,2,0)print(image.shape)image=image*(np.array((0.5,0.5,0.5))+np.array((0.5,0.5,0.5)))image=image.clip(0,1)return imagedataiter=iter(training_loader)images,labels=dataiter.next()fig=plt.figure(figsize=(25,4))for idx in np.arange(20):ax=fig.add_subplot(2,10,idx+1)plt.imshow(im_convert(images[idx]))ax.set_title([labels[idx].item()])class classification1(nn.Module):def __init__(self,input_layer,hidden_layer1,hidden_layer2,output_layer):super().__init__()self.linear1=nn.Linear(input_layer,hidden_layer1)self.linear2=nn.Linear(hidden_layer1,hidden_layer2)self.linear3=nn.Linear(hidden_layer2,output_layer)def forward(self,x):x=func.relu(self.linear1(x))x=func.relu(self.linear2(x))x=self.linear3(x)return xmodel=classification1(784,125,65,10)criteron=nn.CrossEntropyLoss()optimizer=torch.optim.Adam(model.parameters(),lr=0.0001)epochs=12loss_history=[]correct_history=[]for e in range(epochs):loss=0.0correct=0.0for input,labels in training_loader:inputs=input.view(input.shape[0],-1)outputs=model(inputs)loss1=criteron(outputs,labels)optimizer.zero_grad()loss1.backward()optimizer.step()_,preds=torch.max(outputs,1)loss+=loss1.item()correct+=torch.sum(preds==labels.data)else:epoch_loss=loss/len(training_loader)epoch_acc=correct.float()/len(training_loader)loss_history.append(epoch_loss)correct_history.append(epoch_acc)print('training_loss:{:.4f},{:.4f}'.format(epoch_loss,epoch_acc.item()))
热门推荐