五分钟内编写Pytorch模型-600学习网
600学习网终身会员188,所有资源无秘无压缩-购买会员
如果要在五分钟内编写Python模型,需要完成四个步骤:
1.导入和预处理(数据集)数据并对其进行批处理(数据加载器)
2.利用神经网络建立模型。
3.编写一个培训周期并运行。
4.验证集的验证。
由于MNIST已经做了非常彻底的工作,我们将介绍如何导入火炬视觉数据集并在五分钟内编写一些代码。由于这个原因,它不会很漂亮,但会起作用。
下载和导入数据
因为MNIST做了很多工作,我们将搜索标准火炬视觉数据集,看看是否还有其他我们想要尝试和预测的东西。
让我们看看Kuzushiji MNIST,它是由70000张图像组成的MNIST数据集的平假名替代品。
首先,我们找到每个通道的平均值和标准偏差。这背后的原因是我们想要规范化训练数据,但是Python转换需要预先给出规范化的平均值和标准偏差。因此,我们将使用数据集来查找这些值,重新导入它,并传递具有预定义值的标准化转换。
kmnist=datasets.kmnist(data=path,train=True,download=True.transform=transforms.Compose(〔transforms.ToTensor()〕))
kmnist_val=datasets.kmnist(data_path,train=False,download=True,transform=transforms.ToTensor())
请注意,kmnist是一个数据集,因此循环它将为我们提供每个图像和每个标签。因此,如果我们在数据集中的每个图像上循环,并沿着额外的第四维叠加它们,我们将得到所有图像的张量。
imgs=焊炬堆叠([img_t表示img _t,_in kmnist],dim=3)
imgs.形状
>>>焊炬尺寸([1,28,28,60000])
现在我们计算每个通道的平均值。请注意,调用imgs。视图(1,-1)将所有张量压缩到第二维度。在第二个维度中,我们取平均值(因此,dim=1)和像素值的标准偏差。
#计算每个通道的平均值和标准值
mean=imgs.view(1,-1).mean(dim=1)
std=imgs.view(1,-1).std(dim=1)
平均值,标准
>>>(张量([0.1918]).张量([0.3483]))
现在我们可以重新导入数据,使用Normalize变换,并将数组转换为张量。请注意,Normalize将像素值的平均值和标准偏差作为参数。
#标准化数据
t_kmnist=datasets.kmnist(data_path,train=True,download=False,transform=transforms.Compose(〔transforms.ToTensor(),transfords.Normalize((0.1307),(0.3081))〕)
t_kmnist_val=datasets.kmnist(data_path,train=False,download=False,transform=transforms.Compose(〔transforms.ToTensor()〕))
现在我们有了数据集,我们需要将这些数据输入到数据加载器中进行批处理。如果使用CPU,请确保设置较小的批大小和num_workers=1(这是GPU问题,所以不要太担心)。
火车装载机=torch.utils.data.DataLoader(kmnist,批次_大小=128,shuffle=True,num_工人=1)
val_loader=torch.utils.data.DataLoader(kmnist_val,批次_size=128,shuffle=False,num_workers=1)
我们可以从数据集中查看一些样本。
图=plt.图(图=(10,8))
列,行=5,5
对于范围(1,列*行+1)中的i:
sample_idx=torch.randint(len(t_kmnist),size=(1,)).item()
img,标签=t_kmnist〔样本_idx〕
图.添加_子地块(行,列,i)
plt.标题(标签)
plt.轴(“关闭”)
plt.imshow(img.squeze(),cmap=”灰涩”)
plt.show()
构建模型
这不是一个关于如何在理论上构建深度学习模型的教程。因此,我们将在这里介绍模型实现。
首先,需要将模型实例化为nn.Module的实例。其次,需要使用常用的Python方法初始化类。最后,您需要一个模型初始化。在这里,我们定义了所有的模型层,然后是向前方法。这里我们告诉模型如何获取输入并将其传递给这些层。
类网络(nn.模块):
定义_ _初始化_ _(自身):
super(Net,self).__init()
self.conv1=nn.Conv2d(in_channels=1,out_channel=16,kernel_size=5,step=1,padding=2)self.cov2=nn.Cconv2d(内核大小=2))self.layer2=nn.顺序(self.conv2,nn.ReLU(),nn.MaxPool2d(内核大小=2))self.out=nn.线姓(32*7*7,10)#输出10个类
向前定义(self,x):x=self.layer1(x)
x=自身层2(x)
#将conv2的输出平坦化为(批次_大小,32*7*7)
x=x.view(x.size(0),-1)输出=self.out(x)返回输出
在这个阶段,通过提供数据加载器的示例来调试模型总是很重要的。然后,我们将图像传递给模型,并检查其输出的内容大小是否正确。
img,_=next(iter(列车_装载机))
img=img[0]
模型=Net()
模型(img.unqueze(0)).shape
>>>焊炬尺寸([1,10])
我们已经建立了一个完美的模型,它使用K-MNIST图像,并输出10个类,表示从0到9的每个可能数的10个不同概率。
编写并运行训练循环图像
一如既往,我们的培训步骤是相似的。正向传播.损耗计算和梯度重置(Python)。反向传播以计算相关损耗的梯度。使用这些梯度更新权重。
def training_loop(n_epochs,model,loss_fn,optimizer,train_loader):
模型.train()
总步长=len(列车装载机)
对于范围(1,n_epochs+1)中的n:
对于枚举(火车装载机)中的i,(img,标签):输出=模型(变量(imgs))#前向通过损耗=损耗_fn(输出,变量(标签))#计算损耗优化。零_grad()#重置梯度损耗。向后()#反向传播优化。step()#更新权重如果(i+1)%(n_epochs/10)==0:打印(‘{}Epoch〔{〕/{〕〕,步骤〔{}}/}〕,损失:{:.4f}’
.format(datetime.datetime.now(),n,n_epochs,i+1,total_step,loss.item()))
然后,我们实例化我们的模型,设置Adam优化器,并使用交叉熵损失(因为这是一个多类分类问题)。
模型=Net()
优化器=torch.optim.Adam(model.parameters(),lr=1e-2)
损失_ fn=nn.CrossEntropyLoss()
然后将这些参数传递给训练循环。
训练_循环(n_epochs=10,模型=模型
损失_fn=损失_fn,优化器=优化器,列车装载机=列车装载机
)
验证模型
迭代验证数据加载器中的图像和标签,向前传播,并通过在输出张量中找到具有最高值的索引来获得预测(记住,我们输出10个概率向量)。数据squeze()来获取实际的标量本身。最后,计算预测值等于标记数除以标记总数的样本数。
def validate(model,train _loader,val _loader):model.eval()#设置为eval模式,以避免使用焊炬进行批量规范。no _grad():#避免正确计算梯度,total=0,图像为0,val _ loader中的标签:test _output=model(图像)pred _y=torch.max(test _out,1)〔1〕.data.squeeze()精度=(pred_y==labels).sum().item()/float(labels.size(0))打印(‘VALIDATION SET accuracy:%.2f’%精度)验证(模型.列车装载机.val_装载机)
>>>验证设定精度:0.95
验证集的准确率为95%。
结论
使模型更好:
·在模型训练期间打印验证集指标:很明显,我很高兴看到训练损失随着时间的推移而减少。然而,直到我们在训练后验证了模型,我们才真正了解模型的性能。如果您在运行期间打印以验证准确姓,您将更好地了解模型的成功。
·提前停止:一旦验证的准确姓在一定时间内没有提高(称为耐心),请返回性能最佳的时期并使用这些权重。看看其他指标:如曲线下面积(AUC)。
600学习网 » 五分钟内编写Pytorch模型-600学习网