# CNN输出大小公式 | PyTorch系列（二十）

• 准备数据
• 建立模型
• 了解前向传递的转换
• 训练模型
• 分析模型的结果

1. 输入层
2. 隐藏的卷积层
3. 隐藏的卷积层
4. 隐藏的 linear 层
5. 隐藏的 linear 层
6. 输出层

class Network(nn.Module):
def __init__(self):
super().__init__()
self.conv1 = nn.Conv2d(in_channels=1, out_channels=6, kernel_size=5)
self.conv2 = nn.Conv2d(in_channels=6, out_channels=12, kernel_size=5)

self.fc1 = nn.Linear(in_features=12*4*4, out_features=120)
self.fc2 = nn.Linear(in_features=120, out_features=60)
self.out = nn.Linear(in_features=60, out_features=10)

def forward(self, t):
# (1) input layer
t = t

# (2) hidden conv layer
t = self.conv1(t)
t = F.relu(t)
t = F.max_pool2d(t, kernel_size=2, stride=2)

# (3) hidden conv layer
t = self.conv2(t)
t = F.relu(t)
t = F.max_pool2d(t, kernel_size=2, stride=2)

# (4) hidden linear layer
t = t.reshape(-1, 12 * 4 * 4)
t = self.fc1(t)
t = F.relu(t)

# (5) hidden linear layer
t = self.fc2(t)
t = F.relu(t)

# (6) output layer
t = self.out(t)
#t = F.softmax(t, dim=1)

return t

## 传递一个 batch大小为1（单张图像 ）

> network = Network()
> network(image.unsqueeze(0))

# 1 输入层

> t.shape
torch.Size([1, 1, 28, 28])

(batch size, color channels, height, width)

The input layer can be regarded as the trivial identity function, output of the layer is equal to the input.

#2 卷积层 1

> t.shape
torch.Size([1, 1, 28, 28])

> t.shape
torch.Size([1, 6, 24, 24])

The batch_size is fixed as we move through the forward pass.

## 使用滤波器的卷积运算

The out_channels parameter determines how many filters will be created.

The filters are the weight tensors.

1. 颜色通道已传入。
2. 使用权重张量（滤波器）进行卷积。
3. 生成要素图并将其前向传递。

> self.conv1.weight.shape
torch.Size([6, 1, 5, 5])

(number of filters, number of input channels, filter height, filter width)

### relu() 激活函数

> t.min().item()
-1.1849982738494873

> t = F.relu(t)
> t.min().item()
0.0

relu() 函数可以用数学方式表示为

### 最大池化操作

> t.shape
torch.Size([1, 6, 24, 24])

> t = F.max_pool2d(t, kernel_size=2, stride=2)
> t.shape
torch.Size([1, 6, 12, 12])

### 卷积层总结

• 输入形状：[1, 1, 28, 28]
• 输出形状：[1, 6, 12, 12]

• 卷积层使用六个随机初始化的5x5滤波器对输入张量进行卷积。
• 这样可以将高度和宽度尺寸减少四倍。
• relu激活功能操作将所有负值映射为0。
• 这意味着张量中的所有值现在都为正。
• 最大池化操作从由卷积创建的六个特征图的每个2x2部分中提取最大值。
• 这样将高度和宽度尺寸减少了十二。

### 一、CNN输出大小公式（平方）

• 假设有一个 n * n 输入。
• 假设有一个 f*f 的滤波器。
• 假设填充大小为 p 和步长为 s

### 二、CNN输出大小公式（非平方）

• 假设有一个 nh×nw 的输入
• 假设有一个 fh×fw 的滤波器
• 假设填充大小为 p 和步长为 s

＃3 卷积层（2）

self.conv2.weight.shape
torch.Size([12, 6, 5, 5])

> t.shape
torch.Size([1, 6, 12, 12])

> t = self.conv2(t)
> t.shape
torch.Size([1, 12, 8, 8])

> t.min().item()
-0.39324113726615906

> t = F.relu(t)
> t.min().item()
0.0

> t = F.max_pool2d(t, kernel_size=2, stride=2)
> t.shape
torch.Size([1, 12, 4, 4])

self.conv2 输出结果的形状使我们能够了解为什么在将张量传递到第一线性层self.fc1之前使用12 * 4 * 4 重构张量。

> t = t.reshape(-1, 12*4*4)
> t.shape
torch.Size([1, 192])

＃4＃5＃6 Linear 层

> t = self.fc1(t)

> t.shape
torch.Size([1, 120])

> t = self.fc2(t)
> t.shape
torch.Size([1, 60])

> t = self.out(t)
> t.shape
torch.Size([1, 10])

> t
tensor([[ 0.1009, -0.0842,  0.0349, -0.0640,  0.0754, -0.0057,  0.0878,  0.0296,  0.0345,  0.0236]])

### 下一步训练CNN

https://deeplizard.com/learn/video/cin4YcGBh3Q

0 条评论

• ### PyTorch中CNN的Forward方法 | PyTorch系列（十七）

我们通过扩展nn.Module PyTorch基类来创建网络，然后在类构造函数中将网络层定义为类属性。现在，我们需要实现网络的 forward() 方法，最后，...

• ### CNN中张量的输入形状和特征图 | Pytorch系列（三）

在这个神经网络编程系列中，我们正在努力构建卷积神经网络（CNN），所以让我们看看在CNN中的张量输入。

• ### PyTorch，TensorFlow和NumPy中Stack Vs Concat | PyTorch系列（二十四）

原标题：Stack Vs Concat In PyTorch, TensorFlow & NumPy - Deep Learning Tensor Ops

• ### 基于Django的电子商务网站开发（连载22）

表3-4为商品信息列表的测试用例。测试目的是把测试数据中的商品信息插入到数据库中，检验这个商品的列表信息是否可以正确地被显示出来。

• ### 2019年腾讯云服务器爆品抢购进行中1核1G1年仅168元

活动时间：2018年12月12日至2019年1月25日，每天两场秒杀，时间分别为：9：00-12：00，14：00-18：00。

• ### 测试开发进阶(二十七)

projects.serializer.ProjectModelSerializer中添加

• ### 多维张量的几何理解

Tensor是Tensorflow中最基础的数据结构，常常翻译为张量，可以理解为n维数组或矩阵，相关函数：

• ### 深度学习（二）--tensor张量

关于“tensorflow”这个专栏，我打算一直更新下去，文章基本都是随着我的进度来的，我也是查找了一些资料并根据自己的一些理解写的，可能内容偶尔会...

• ### 源码分析Dubbo服务提供者启动流程-上篇

本节将详细分析Dubbo服务提供者的启动流程，请带着如下几个疑问进行本节的阅读，因为这几个问题将是接下来几篇文章分析的重点内容。