Tensorflow 如何解释CNN中的model.summary()输出?

Tensorflow 如何解释CNN中的model.summary()输出?,tensorflow,keras,deep-learning,google-colaboratory,cnn,Tensorflow,Keras,Deep Learning,Google Colaboratory,Cnn,我是深度学习和CNN的新手。如果如屏幕截图所示创建了CNN,那么如何解释model.summary所述的输出。我无法理解不同层的输出形状 模型摘要: Model: "sequential_3" _________________________________________________________________ Layer (type) Output Shape Param # =====================

我是深度学习和CNN的新手。如果如屏幕截图所示创建了CNN,那么如何解释model.summary所述的输出。我无法理解不同层的输出形状

模型摘要:

Model: "sequential_3"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_14 (Conv2D)           (None, 29, 29, 32)        1568      
_________________________________________________________________
max_pooling2d_6 (MaxPooling2 (None, 14, 14, 32)        0         
_________________________________________________________________
conv2d_15 (Conv2D)           (None, 11, 11, 32)        16416     
_________________________________________________________________
max_pooling2d_7 (MaxPooling2 (None, 5, 5, 32)          0         
_________________________________________________________________
flatten_3 (Flatten)          (None, 800)               0         
_________________________________________________________________
dense_6 (Dense)              (None, 32)                25632     
_________________________________________________________________
dense_7 (Dense)              (None, 10)                330       
=================================================================
Total params: 43,946
Trainable params: 43,946
Non-trainable params: 0

你的第一层是一个卷积,它采用未知的输入形状。你知道它,你用input_shape=

第一个卷积具有形状为None、29、29、32的输出,其中:

无是批量大小 29和29是结果图像的大小 32是此卷积的滤波器数,也是其输出中的通道数 然后有一个maxpooling层,它将卷积的输出作为输入。池的输出具有形状None、14、14、32,因此它将图像的大小除以2,其余部分保持原样

然后有另一个卷积,将池的输出作为输入,这个新卷积的输出形状是None,11,11,32。您在这里也使用了32个过滤器

。。。。

然后你有一个展平层,它将图像转换成一个向量,输出形状为None,800,其中None仍然是未触及的批次大小,800是输入张量中的所有元素,现在在一个向量中,批次中每个样本一个向量

然后是致密层,第一层为32个单位,第二层为10个单位

模型的最终输出形状为无,10。它在批次中为每个样本输出10个值

每个层都有许多参数,这些参数通常是权重。可训练的参数将通过反向传播进行更新。不可训练的参数将保持静态,或将使用不同的方法更新。只有少数层(如BatchNormalization)具有使用不同方法更新的参数


您的模型总共有43946个重量,都是可训练的

根据问题,假设每个图像的大小是32,32,3

然后,Keras为处理多个批次附加了一个额外维度,即在单个历元的每个步骤中训练多个图像。由于批次大小可能会有所不同,因此其大小由“无”表示。因此,输入形状变为无、32、32、3

使用4,4过滤器对32,32图像进行卷积,步长和膨胀率为1,并使用“有效”填充,结果输出大小为32-4+1,32-4+1=29,29。因为您有32个这样的过滤器,所以输出形状变为29、29、32

默认的MaxPooling内核的形状为2,2,步长为2,2。将其应用于29,29图像会得到形状为29-2//2+1,29-2//2+1=14,14的图像

此模式可以扩展到所有Conv2D和MaxPooling层

展平层沿所有通道获取所有像素,并创建一个1D向量,不考虑批量大小。因此,将输入5、5、32展平为5*5*32=800个值

参数计数

Conv2D图层的参数数量由以下公式给出:

内核高度*内核宽度*输入通道*输出通道+输出通道(如果使用偏置)

因此,对于具有3个输入通道、32个输出通道和4,4内核大小的第一个Conv2D层,参数数量为4*4*3*32+32=1568。

对于Conv2D, 正如您所注意到的,输出形状为None、10、10、64。第一个维度表示批次大小,目前没有。因为网络事先不知道批量大小。拟合数据后,拟合数据时给出的批大小将不会替换任何数据

Input shape

4D tensor with shape: (batch, channels, rows, cols) if data_format is "channels_first" 
or 4D tensor with shape: (batch, rows, cols, channels) if data_format is 
"channels_last".

Output shape

4D tensor with shape: (batch, filters, new_rows, new_cols) if data_format is 
"channels_first" or 4D tensor with shape: (batch, new_rows, new_cols, filters) if 
data_format is "channels_last". rows and cols values might have changed due to 
padding.
对于maxpool2d层,值与上面的值相同,只是有如下细微的更改

**Input**

If data_format='channels_last': 4D tensor with shape: (batch_size, rows, cols, channels)
If data_format='channels_first': 4D tensor with shape: (batch_size, channels, rows, cols)

**Output**

If data_format='channels_last': 4D tensor with shape: (batch_size, pooled_rows, pooled_cols, channels)
If data_format='channels_first': 4D tensor with shape: (batch_size, channels, pooled_rows, pooled_cols)
现在,我们可以简单地在另一个卷积层的顶部添加一个卷积层,因为卷积的输出维度与其输入维度相同。 我们通常在卷积层的顶部添加稠密层来对图像进行分类。但是,将数据输入到形状批次大小(单位)的密集层2D数组中。卷积层的输出为4D阵列。因此,我们必须将从卷积层接收到的输出的维数更改为2D阵列

我们可以通过在卷积层的顶部插入一个展平层来实现。展平层将图像的3个维度压缩为单个维度。现在我们只有一个二维数组,形状为批处理大小,挤压大小,这对于致密层来说是可以接受的


希望这能对您有所帮助。

这意味着如果填充被明确定义为相同,那么第一个卷积层的输出将是32,32,32?