前言
作为刚入门深度学习的一位初学者来说,各种各样的学习资料、视频让我看得头昏眼花。明明本来是想了解Pytorch使用方法,莫名其妙看了一个多小时的算法推理,原理逻辑,让人很是苦恼。于是在自己学习了一段时间后,打算做出这个pytorch的系列教程,就是想让大家基于项目进行实战,更多地了解pytorch这个深度学习框架。废话不多说,我们开始第一期的实战之旅。
搭建环境
作为一个基础教程,我们从搭建环境开始做起,本篇环境搭建适用于windows用户。
python环境安装
这个不多讲了,直接官网下载一个版本的python安装即可。
深度学习环境安装
本篇文章着重讲的部分就是安装pytorch,在此之前,你需要确保电脑上已经进行了python的安装,并且配置了系统的环境变量,否则在这一步将会出现各种问题。所有由于python没有安装导致的问题,这篇文章不进行解答。
首先,进入pytorch,根据自己的需求选择相应的安装方式。pytorch官方网站
一般我们选择的时候都是选stable版本,也就是稳定版,这样用的过程中不会出现一些奇奇怪怪的问题。
这里注意一下,电脑操作系统的版本、python包管理器的类型、编程语言、是否下载GPU版本的pytorch,这些选项都会影响最后红框中生成的命令。
我这里选择GPU版本的pytorch,因为自己的显卡是N卡3060,如果大家没有显卡可以下载CPU类型的pytorch,作为初学深度学习者,CPU版本也就够用了。
pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121
由于pytorch的包托管在境外,下载的速度会比较慢,这里建议选择国内镜像源进行下载。
下载完成之后可以进行验证,看是否能够正确识别到电脑显卡。
import torch
print(torch.cuda.is_available())
如果输出是True说明GPU版本的pytorch已经安装完成,现在就可以来进行搭建网络的操作了。
模型搭建
在搭建模型前,我们可以自己进行网络结构的设计,或者也可以参考他人的网络的结构,进行设计。这里我们从下面这张网络结构图进行设计。
在设计网络之前,我们首先需要了解我们的数据集是什么大小,以及我们期望的输出是什么样的。由于MNIST数据集已经提前帮我们确定好了这些,所以我们只需要记住就行。MNIST数据集是每张图片都是由1个单通道28x28像素构成的。我们最终需要网络给我们预测10中数字的概率,所以网络的最终的输出应该是10。知道了这些,我们就可以开始着手设计网络。
pytorch中提供了很方便的方式,我们只需要通过不到100行代码便可以设计出一个优雅的网络出来。
from torch import nn
class MyNet(nn.Module):
def __init__(self):
"""
初始化神经网络
:param args:
:param kwargs:
"""
super(MyNet, self).__init__()
self.conv1 = nn.Conv2d(1, 28, 5, padding=2)
self.maxpool1 = nn.MaxPool2d(2)
self.drop1 = nn.Dropout(0.5)
self.conv2 = nn.Conv2d(28, 28, 5, padding=2)
self.maxpool2 = nn.MaxPool2d(2)
self.drop2 = nn.Dropout(0.5)
self.conv3 = nn.Conv2d(28, 64, 5, padding=2)
self.maxpool3 = nn.MaxPool2d(2)
self.flatten = nn.Flatten()
self.linear1 = nn.Linear(576, 64)
self.linear2 = nn.Linear(64, 10)
def forward(self, x):
"""
前向传播函数
:param x: input
:return:
"""
x = self.conv1(x)
print(x.shape)
x = self.maxpool1(x)
x = self.drop1(x)
x = self.conv2(x)
x = self.maxpool2(x)
x = self.drop2(x)
x = self.conv3(x)
x = self.maxpool3(x)
x = self.flatten(x)
x = self.linear1(x)
x = self.linear2(x)
return x
如此,我们的网络就搭建好了,我们试着实例化该网络,然后输出看下它的结构。
model = MyNet()
print(model)
//输出的网络结构如下
MyNet(
(conv1): Conv2d(1, 28, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2))
(maxpool1): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
(drop1): Dropout(p=0.5, inplace=False)
(conv2): Conv2d(28, 28, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2))
(maxpool2): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
(drop2): Dropout(p=0.5, inplace=False)
(conv3): Conv2d(28, 64, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2))
(maxpool3): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
(flatten): Flatten(start_dim=1, end_dim=-1)
(linear1): Linear(in_features=576, out_features=64, bias=True)
(linear2): Linear(in_features=64, out_features=10, bias=True)
)
本次的文章到这里就结束了,后续系列将继续对MNIST手写数据网络搭建及训练+预测进行教学,我们下期再见!
标签:nn,self,28,Pytorch,padding,pytorch,手写,MNIST,搭建 From: https://blog.csdn.net/weixin_42746181/article/details/139727661