博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
pytorch搭建神经网络-第一篇博客
阅读量:5151 次
发布时间:2019-06-13

本文共 2435 字,大约阅读时间需要 8 分钟。

1、导入库

import torchimport torch.nn as nn

 2、搭建卷积神经网络

class Net(nn.Module):    def __init__(self):        super(Net,self).__init__()        self.conv = nn.Conv2d(in_channels=1,out_channels=6,kernel_size=3)        self.linear = nn.Linear(5766,10)        self.relu = nn.ReLU(inplace=True)        self.maxpooling = nn.MaxPool2d((2,2))    def forward(self, x):        x = self.conv(x)        #print (x.shape)        x = self.maxpooling(x)        #print (x.shape)        x = self.relu(x)        x = x.view(1,-1)        #print (x.shape)        x = self.linear(x)        return x

对于新手来说,可以先熟悉pytorch的格式。网络定义一般由两部分组成,

def __init__(self):用来定义网络节点参数; def forward(self, x): 将节点连接成图。 卷积计算规则,对我们输入形状(1,1,64,64),四个维度分别是(batch,channel,height,width)。batch:一次训练的批次,channel图像通道(比如RGB,channel = 3)。height,width分别指图像的高和宽。 new_height= (height - kernel_size + 2×padding)/(stride[0])+1;padding默认为0,意思的在周围补一圈零; stride默认为1,因此。 new_height = new_width = (64 - 3)/(1) + 1 = 62。 由于输出通道数为6,所以通过卷积层后维度(1,6,62,62) 经过pooling后,(1,6,31,31) x.view(1,-1):把x伸缩为(1,?)的维度,即(1,1×6×31×31)=(1,5766) nn.Linear(5766,10),把(1,5766)映射为(1,10)的维度。这样整个网络其实输入(1,1,64,64),输出(1,10) 3、添加训练数据
if __name__ =='__main__':    device = torch.device("cuda" if torch.cuda.is_available() else "cpu")    net = Net().to(device)    optimizer = torch.optim.Adam(net.parameters())    criterion = nn.MSELoss()    net.train()    epoch = 100    input = torch.randn(1,1,64,64).cuda()    output = torch.ones(1,10).cuda()    batch = 32
optimizer:是优化器,即所谓的反向传播算法。 criterion = nn.MSELoss()定义损失函数。 input = torch.randn(1,1,64,64).cuda() output = torch.ones(1,10).cuda()。定义训练样本,注意如果在gpu中训练,在pytorch中需要.cuda()把数据从cpu中导入到gpu中 网络的功能是给定随机噪声向量,输出是逼近1的单位向量。 4、训练:
for step in range(epoch):        prediction = net(input)        loss = criterion(prediction, output)        optimizer.zero_grad()        #消除优化器梯度        loss.backward()        optimizer.step()        if step % 10 == 0:            print("EPOCHS: {},Loss:{:4f}".format(step, loss))
loss.backward() 指自动求导 optimizer.step() 指根据自动求导反向传播优化参数。 5、我们可以输出样本看看结果:
print (prediction.cpu().detach().numpy()) #返回一个新的 从当前图中分离的 Variable。print (output.cpu().numpy())
注意输出结果时必须对张量.cpu()把张量从gpu转到cpu中。 对于计算图中的张量(比如x,prediction),必须加.detach()从计算图中导出才能转化成numpy。 输出结果: [[1.0127475  0.98897606 1.002695   0.9881151  1.0137383  1.0051517   1.0140573  1.0051212  1.0088345  0.9978328 ]] [[1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]] (若有新的见解请加以批评指正)

转载于:https://www.cnblogs.com/venray/p/10495612.html

你可能感兴趣的文章
Centos 7.0 安装Mono 3.4 和 Jexus 5.6
查看>>
CSS属性值currentColor
查看>>
java可重入锁reentrantlock
查看>>
浅谈卷积神经网络及matlab实现
查看>>
解决ajax请求cors跨域问题
查看>>
《收获,不止Oracle》pdf
查看>>
Real-Time Rendering 笔记
查看>>
如何理解HTML结构的语义化
查看>>
Activity之间的跳转:
查看>>
实验四2
查看>>
多路复用
查看>>
Python数据可视化之Pygal(雷达图)
查看>>
Java学习笔记--字符串和文件IO
查看>>
转 Silverlight开发历程—(画刷与着色之线性渐变画刷)
查看>>
SQL语法(3)
查看>>
在js在添版本号
查看>>
sublime3
查看>>
Exception Type: IntegrityError 数据完整性错误
查看>>
Nuget:Newtonsoft.Json
查看>>
Hdu - 1002 - A + B Problem II
查看>>