今天学习的是一个由两个卷积层和三个全连接层组成的神经网络。接触到了机器学习领域,要学的东西多了起来。
#导入包
import torch
import torch.nn as nn
import torch.nn.functional as F
#定义神经网络
class Net(nn.Module):
def __init__(self):#定义神经网络结构,输入数据结构为 1x32x32
super(Net, self).__init__()#两个卷积层,三个全连接层
#第一层(卷积层)
self.conv1 = nn.Conv2d(1,6,3) #nn.Conv2d用来定义二维卷积层
#1,6,3 分别代表了 输入频道、输出频道、卷积大小
#第二层(卷积层)
self.conv2 = nn.Conv2d(6,16,3)#输入频道 6,输出频道 16,卷积 3x3
#第三层(全连接层)
self.fc1 = nn.Linear(16*28*28,512)#16:Conv2d的输出,28:32-2-2(每次卷积减2)
#输入维度 16x28x28=12544,输出维度 512
#第四层(全连接层)
self.fc2 = nn.Linear(512, 64)#输入维度 512,输出维度 64
#第五层(全连接层)
self.fc3 = nn.Linear(64, 2)#输入维度 64,输出维度 2
def forward(self, x): #定义数据流向
#x=self.conv1(x)
x = self.conv1(x)
x = F.relu(x)
x = self.conv2(x)
x = F.relu(x)
x = x.view(-1,16*28*28)
x = self.fc1(x)
x = F.relu(x)
x = self.fc2(x)
x = F.relu(x)
x = self.fc3(x)
return x
#随机生成输入
input_data = torch.randn(1,1,32,32)
print(input_data)
print(input_data.size())
#运行神经网络
out=net(input_data)
print(out)
print(out.size())
#随机生成目标值
target=torch.randn(2)
target=target.view(1,-1)#??为什么是(1,-1)
a=torch.randn(2).view(1,-1)
print(target)
print(a)
criterion=nn.L1Loss()#定义损失函数
loss=criterion(out,target)
print(loss)
#反向传递,需要先把所有的梯度清零
net.zero_grad()#清零梯度
loss.backward()#自动计算梯度,反向传递
import torch.optim as optim#用于更新权重
optimizer = optim.SGD(net.parameters(),lr=0.01) #权重更新规则
#使用SGD规则,更新net中的全部parameters;更新的学习速率(lr)为0.01
optimizer.step()
#再次运行神经网络
out=net(input_data)
print(out)
print(out.size())
#重新计算损失
loss=criterion(out,target)
print(loss)
目前不清楚代码到底是干什么的,不过知道的是训练后随机和目标值之间的差距减小了。目前这个五层的神经网络能做到的是,通过训练使得输入值更接近目标值,里面还有好多函数不清楚,这段代码要看一段时间了。