DEEP LEARNING WITH PYTORCH: A 60 MINUTE BLITZ (官网60min闪电战第三部分注释)
NEURAL NETWORKS
import torch
import torch.nn as nn
import torch.nn.functional as F
class Net(nn.Module): #继承nn.Moudle
def __init__(self): #类的初始化方法,个人觉得相当于C++中的构造函数,在实例化类的时候会自动调用此方法
super(Net, self).__init__() #调用nn.Moudle的构造函数
# 1 input image channel, 6 output channels, 3x3 square convolution
# kernel
self.conv1 = nn.Conv2d(1, 6, 3) #建立一个卷积层,输入为1通道灰度图,输出为6通道特征图,卷积核的大小为3x3
self.conv2 = nn.Conv2d(6, 16, 3) #建立一个卷积层,输入6通道特征图,输出为16通道特征图,16个6通道的卷积层,每个卷积层卷积核的大小为3x3
# an affine operation: y = Wx + b
self.fc1 = nn.Linear(16 * 6 * 6, 120) #6*6 from image dimension #输入为16*6*6的维度,输出为120的全连接层
self.fc2 = nn.Linear(120, 84) #输入为120的维度,输出为84的全连接层
self.fc3 = nn.Linear(84, 10) #输入为84的维度,输出为10的全连接层
def forward(self, x):
# Max pooling over a (2, 2) window
x=self.conv1(x) #调用卷积层
x=F.relu(x) #应用激活函数
x = F.max_pool2d(x, (2, 2)) #池化层下采样,具体为在2*2的方格中取一个最大值(非重叠池化)
# If the size is a square you can only specify a single number
x=self.conv2(x) #调用卷积层
x=F.relu(x) #应用激活函数
x = F.max_pool2d(x, 2) #池化层下采样,具体为在2*2的方格中取一个最大值,由于为2*2的正方形。所以可以只写一个边长//另外要注意的是,此处为非重叠池化
x = x.view(-1, self.num_flat_features(x)) #前面得到的特征图全部展开,-1代表第一个参数不用动(因为第一个参数代表输入样本的个数,也就是输入几张照片)
#print(x.size())
x = F.relu(self.fc1(x)) #进行第一层全连接并使用激活函数映射
x = F.relu(self.fc2(x)) #进行第一层全连接并使用激活函数映射
x = self.fc3(x) #第三层直接进行输出
return x
def num_flat_features(self, x): #计算一张图片上所有量的个数,展开为全连接所用
size = x.size()[1:] # all dimensions except the batch dimension
#print(size)
num_features = 1
for s in size:
num_features *= s
return num_features
#x=torch.randn(8,1,32,32) #可以理解为:随机生成8张大小为32x32的1通道灰度图片(如果是彩色图第二个参数是3)
net = Net()
#result=net(x)
print(net)