其他
PyTorch 教程-图像识别中神经网络的实现
我们的下一个任务是使用先前标记的图像来训练神经网络,以对新的测试图像进行分类。因此,我们将使用nn模块来构建我们的神经网络。
实现图像识别神经网络的步骤如下:
步骤1:
from torch import nn
class 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):
步骤3:
import torch.nn.functional as func
def 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')
Epoch Loss
Epoch accuracy
完整代码
import torch
import matplotlib.pyplot as plt
import numpy as np
import torch.nn.functional as func
from torch import nn
from torchvision import datasets, transforms
transform1=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 image
dataiter=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 x
model=classification1(784,125,65,10)
criteron=nn.CrossEntropyLoss()
optimizer=torch.optim.Adam(model.parameters(),lr=0.0001)
epochs=12
loss_history=[]
correct_history=[]
for e in range(epochs):
loss=0.0
correct=0.0
for 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()))