文章目录
- 自己在学校上课学的CNN算法都忘了差不多了,自己在官网弄了一个图片分类的算法准备优化精度居然完全看不懂!这就蛋疼了,弄了一下午终于明白各个参数之间的含义以及如何计算参数的值了!
- self.conv1 = nn.Conv2d(1, 6, 5) # 定义conv1函数的是图像卷积函数:输入为图像(1个频道,即灰度图),输出为 6张特征图, 卷积核为5x5正方形
self.conv2 = nn.Conv2d(6, 16, 5)# 定义conv2函数的是图像卷积函数:输入为6张特征图,输出为16张特征图, 卷积核为5x5正方形
self.fc1 = nn.Linear(16*5*5, 120) # 定义fc1(fullconnect)全连接函数1为线性函数:y = Wx + b,并将16*5*5个节点连接到120个节点上。
self.fc2 = nn.Linear(120, 84)#定义fc2(fullconnect)全连接函数2为线性函数:y = Wx + b,并将120个节点连接到84个节点上。
self.fc3 = nn.Linear(84, 10)#定义fc3(fullconnect)全连接函数3为线性函数:y = Wx + b,并将84个节点连接到10个节点上。
- 不考虑padding N:输入width/height, F: 卷积核大小/filter_size, stride:步长 考虑padding N:输入width/height, F: 卷积核大小/filter_size, stride:步长, Pad: paddings大小
- 以下 第一次卷积: {3x32x32 | 3X3(卷积核)} => {1000(任意值)x30x30} 30 = {(32-3)/1}+1 池化: 1000x30x30 => 1000x15x15 15 = 30/2 第二次卷积: {1000x15x15 | 4X4(卷积核)} => {100(任意值)x12x12} 12 = {(15-4)/1}+1 第二次池化: 100x12x12 => 100x6x6 6 = 12/2 class Net(nn.Module): def __init__(self): super(Net, self).__init__() self.conv1 = nn.Conv2d(3, 1000, 3) #输入信号通道3(RGB三通道,即一个彩色图片对于的RGB三个图),卷积核(Kernel,卷积核,有时也称为filter)尺寸:3,卷积产生100个特征图(该数字为自己填写的,可大可小,但超出图片像素综合则感觉毫无意义) self.pool = nn.MaxPool2d(2, 2)#处理后的特征图片是30×30的,我们对其进行下采样,采样窗口为15X15,最终将其下采样成为一个2×2大小的特征图。 self.conv2 = nn.Conv2d(1000, 5, 4)#输入信号通道100(RGB三通道),卷积核(Kernel,卷积核,有时也称为filter)尺寸:3,卷积产生100个特征图(该数字为自己填写的,可大可小,但超出图片像素综合则感觉毫无意义) #三个全连接池 self.fc1 = nn.Linear(5*6*6, 360)#处理后的特征图片是12×12的,我们对其进行下采样,采样窗口为6X6,最终将其下采样成为一个2×2大小的特征图。 self.fc2 = nn.Linear(360, 250) self.fc20 = nn.Linear(250, 84) self.fc3 = nn.Linear(84, 10) def forward(self, x): x = self.pool(F.relu(self.conv1(x))) x = self.pool(F.relu(self.conv2(x))) x = x.view(-1, 5*6*6) x = F.relu(self.fc1(x)) x = F.relu(self.fc2(x)) x = F.relu(self.fc20(x)) x = self.fc3(x) return x
- https://pytorch.org/tutorials/beginner/nn_tutorial.html 理解CNN参数及PyTorch实例 超简单!pytorch入门教程(三):构造一个小型CNN 史上最全的cnn参数计算详解
自己在学校上课学的CNN算法都忘了差不多了,自己在官网弄了一个图片分类的算法准备优化精度居然完全看不懂!这就蛋疼了,弄了一下午终于明白各个参数之间的含义以及如何计算参数的值了!
自己在学校上课学的CNN算法都忘了差不多了,自己在官网弄了一个图片分类的算法准备优化精度居然完全看不懂!这就蛋疼了,弄了一下午终于明白各个参数之间的含义以及如何计算参数的值了!
self.conv1 = nn.Conv2d(1, 6, 5) # 定义conv1函数的是图像卷积函数:输入为图像(1个频道,即灰度图),输出为 6张特征图, 卷积核为5x5正方形
self.conv2 = nn.Conv2d(6, 16, 5)# 定义conv2函数的是图像卷积函数:输入为6张特征图,输出为16张特征图, 卷积核为5x5正方形
self.fc1 = nn.Linear(16*5*5, 120) # 定义fc1(fullconnect)全连接函数1为线性函数:y = Wx + b,并将16*5*5个节点连接到120个节点上。
self.fc2 = nn.Linear(120, 84)#定义fc2(fullconnect)全连接函数2为线性函数:y = Wx + b,并将120个节点连接到84个节点上。
self.fc3 = nn.Linear(84, 10)#定义fc3(fullconnect)全连接函数3为线性函数:y = Wx + b,并将84个节点连接到10个节点上。
self.conv1 = nn.Conv2d(1, 6, 5) # 定义conv1函数的是图像卷积函数:输入为图像(1个频道,即灰度图),输出为 6张特征图, 卷积核为5x5正方形
self.conv2 = nn.Conv2d(6, 16, 5)# 定义conv2函数的是图像卷积函数:输入为6张特征图,输出为16张特征图, 卷积核为5x5正方形
self.fc1 = nn.Linear(16*5*5, 120) # 定义fc1(fullconnect)全连接函数1为线性函数:y = Wx + b,并将16*5*5个节点连接到120个节点上。
self.fc2 = nn.Linear(120, 84)#定义fc2(fullconnect)全连接函数2为线性函数:y = Wx + b,并将120个节点连接到84个节点上。
self.fc3 = nn.Linear(84, 10)#定义fc3(fullconnect)全连接函数3为线性函数:y = Wx + b,并将84个节点连接到10个节点上。
以下
- 第一次卷积:
{3x32x32 | 3X3(卷积核)} => {1000(任意值)x30x30}
30 = {(32-3)/1}+1
- 池化:
1000x30x30 => 1000x15x15
15 = 30/2
- 第二次卷积:
{1000x15x15 | 4X4(卷积核)} => {100(任意值)x12x12}
12 = {(15-4)/1}+1
- 第二次池化:
100x12x12 => 100x6x6
6 = 12/2
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.conv1 = nn.Conv2d(3, 1000, 3) #输入信号通道3(RGB三通道,即一个彩色图片对于的RGB三个图),卷积核(Kernel,卷积核,有时也称为filter)尺寸:3,卷积产生100个特征图(该数字为自己填写的,可大可小,但超出图片像素综合则感觉毫无意义)
self.pool = nn.MaxPool2d(2, 2)#处理后的特征图片是30×30的,我们对其进行下采样,采样窗口为15X15,最终将其下采样成为一个2×2大小的特征图。
self.conv2 = nn.Conv2d(1000, 5, 4)#输入信号通道100(RGB三通道),卷积核(Kernel,卷积核,有时也称为filter)尺寸:3,卷积产生100个特征图(该数字为自己填写的,可大可小,但超出图片像素综合则感觉毫无意义)
#三个全连接池
self.fc1 = nn.Linear(5*6*6, 360)#处理后的特征图片是12×12的,我们对其进行下采样,采样窗口为6X6,最终将其下采样成为一个2×2大小的特征图。
self.fc2 = nn.Linear(360, 250)
self.fc20 = nn.Linear(250, 84)
self.fc3 = nn.Linear(84, 10)
def forward(self, x):
x = self.pool(F.relu(self.conv1(x)))
x = self.pool(F.relu(self.conv2(x)))
x = x.view(-1, 5*6*6)
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = F.relu(self.fc20(x))
x = self.fc3(x)
return x
以下
{3x32x32 | 3X3(卷积核)} => {1000(任意值)x30x30}
30 = {(32-3)/1}+1
1000x30x30 => 1000x15x15
15 = 30/2
{1000x15x15 | 4X4(卷积核)} => {100(任意值)x12x12}
12 = {(15-4)/1}+1
100x12x12 => 100x6x6
6 = 12/2
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.conv1 = nn.Conv2d(3, 1000, 3) #输入信号通道3(RGB三通道,即一个彩色图片对于的RGB三个图),卷积核(Kernel,卷积核,有时也称为filter)尺寸:3,卷积产生100个特征图(该数字为自己填写的,可大可小,但超出图片像素综合则感觉毫无意义)
self.pool = nn.MaxPool2d(2, 2)#处理后的特征图片是30×30的,我们对其进行下采样,采样窗口为15X15,最终将其下采样成为一个2×2大小的特征图。
self.conv2 = nn.Conv2d(1000, 5, 4)#输入信号通道100(RGB三通道),卷积核(Kernel,卷积核,有时也称为filter)尺寸:3,卷积产生100个特征图(该数字为自己填写的,可大可小,但超出图片像素综合则感觉毫无意义)
#三个全连接池
self.fc1 = nn.Linear(5*6*6, 360)#处理后的特征图片是12×12的,我们对其进行下采样,采样窗口为6X6,最终将其下采样成为一个2×2大小的特征图。
self.fc2 = nn.Linear(360, 250)
self.fc20 = nn.Linear(250, 84)
self.fc3 = nn.Linear(84, 10)
def forward(self, x):
x = self.pool(F.relu(self.conv1(x)))
x = self.pool(F.relu(self.conv2(x)))
x = x.view(-1, 5*6*6)
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = F.relu(self.fc20(x))
x = self.fc3(x)
return x



