提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
今天和大家分享一个我测试过了的用pytorch构建的神经网络,希望这是我的脚买入深度学习的大门的第一步
提示:以下是本篇文章正文内容,下面案例可供参考
一、构建一个卷积神经网络的步骤
1构建一个网络类对象,对象中一定要包括初始化函数、向前传播函数; 2实例化类对象,向网络中传入数据,改变参数; 3求损失; 4优化器进行参数优化; 5误差反向传播;二、代码实现
1.引入库
代码如下(示例):
import torcn
import torch.nn as nn
import torch.nn.functional as F
2.构建网络类对象
代码如下(示例):
#定义网络类
class Net(nn.Module):
def __init__(self):
super(Net,self).__init__()
#定义第一层卷积层,输入维度=1,输出维度=6,卷积核大小3*3
self.conv1=nn.Conv2d(1,6,3)
#定义第二层卷积层,输入维度=6,输出维度=16,卷积核大小3*3
self.conv2=nn.Conv2d(6,16,3)
#定义三层全连接神经网络
self.fc1=nn.Linear(17280,120)
self.fc2=nn.Linear(120,64)
self.fc3=nn.Linear(64,1)
def forward(self,x):
#注意任意卷积层后面要加激活层和池化层
x=F.max_pool2d(F.relu(self.conv1(x)),(2,2))
x=F.max_pool2d(F.relu(self.conv2(x)),2)
#经过卷积层的处理后,张量进入全连接层,进入前需要调整张量的形状
x=x.view(-1,self.num_flat_feature(x))
x=F.relu(self.fc1(x))
x=F.relu(self.fc2(x))
x=self.fc3(x).squeeze(1)
return x
def num_flat_feature(self,x):
size=x.size()[1:]
num_features=1
for s in size:
num_features*=s
return num_features
3.实例化类对象,调整网络内部参数
代码如下(示例):
net=Net() #实例化类对象
input=torch.randn(1,1,128,150) #conv2d的输入需要是一个四维的张量
print(input.size())
out=net(input)
print(out)
print(out.size()) #输出的维度则是由全连接层最后一层的维度决定的
#input[1, 1, 128, 150]->conv1poll[1, 6, 63, 74]->conv2pool[1, 16, 30, 36]->view[1, 17280]->linear1relu[1, 120]->linear2relu[1,64]->linear3relu[1]
#上面这样的维度确定是打开相应层所得到的output.size()
#通过卷积层的维度,第二个由卷积层的输入决定;第三第四由池化部分的参数决定,该值为input/pool参数-1;
#线性层只要输入和输出相对应就好
4.求损失
代码如下(示例):
target=torch.randn(1)
print(target)
print(target.size()) #target和out的size需要对应,不然就要通过view来转换
criterion=nn.MSELoss()
loss=criterion(out,target)
5.构建优化器
代码如下(示例):
import torch.optim as optim #导入优化器的包
optimizer=optim.SGD(net.parameters(),lr=0.01) #构建优化器
optimizer.zero_grad() #优化器的梯度清零
6.误差反向传播
代码如下(示例):
loss.backward() #误差反向传播
optimizer.step() #优化器更新网络参数
总结
就到这里啦,使用pytorch构建的一个简单的conv2d的神经网络,之后应该还会以一个实际例子来总结训练、模型保存和加载、以及测试的部分。写博客的第二天,希望之后能坚持,最好能以这个频率坚持下去,加油加油!!