【问题标题】:How to check the number of layers in a neural network in python and when should we increase the layers?如何在 python 中检查神经网络的层数以及何时应该增加层数?
【发布时间】:2021-03-18 14:35:51
【问题描述】:

请对您的想法添加最低限度的评论,以便我改进查询。谢谢。 -)


我正在处理MNIST 数据集并编写一些CNN 代码。但是,我对CNN 代码中的某些要点感到困惑。如何知道神经网络的层数?以我目前的理解,我认为这有 6 层和 4 个隐藏层。那正确吗?如果我需要扩展到 10 层怎么办?怎么办?

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Conv2D, Dropout, Flatten, MaxPooling2D

model = Sequential()
model.add(Conv2D(28, kernel_size=(3,3), 
                    input_shape = ...))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Flatten())
model.add(Dense(128, activation=tf.nn.relu))
model.add(Dropout(0.2))
model.add(Dense(10, activation=tf.nn.softmax))

【问题讨论】:

  • number of layers in dataset 是什么意思?你能澄清一下吗?
  • 输入层+隐藏层+输出层等层数
  • 数据集没有层,这就是人们对你的问题感到困惑的原因。
  • 哦,对不起..我的意思是卷积网络中的层数
  • 假设有人问我上面的模型有多少层,答案是什么?是 6 点吗?

标签: python tensorflow machine-learning keras deep-learning


【解决方案1】:

如果你打印你的模型的.summary(),你会得到

Model: "sequential_1"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_1 (Conv2D)            (None, 26, 26, 28)        280       
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 13, 13, 28)        0         
_________________________________________________________________
flatten_1 (Flatten)          (None, 4732)              0         
_________________________________________________________________
dense (Dense)                (None, 128)               605824    
_________________________________________________________________
dropout (Dropout)            (None, 128)               0         
_________________________________________________________________
dense_1 (Dense)              (None, 10)                1290      
=================================================================
Total params: 607,394
Trainable params: 607,394
Non-trainable params: 0

print(len(model.layers)) # 6

如您所见,您构建了一个由 6 层组成的深度神经网络 - 其中一些是trainable 层,其中一些是non-trainable 层。所以,如果有人问你模型的层数,那只是 6


还有,如何在其中扩展或添加更多层。嗯,这很简单,就像往杯子里灌水一样。像这样

import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import (Dense, Conv2D, Dropout,
                                     Flatten, MaxPooling2D, BatchNormalization)

model = Sequential()
model.add(Conv2D(16, kernel_size=(3,3), 
                    input_shape = (28,28,1)))
model.add(Conv2D(32, kernel_size=(3, 3), activation="relu"))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(64, kernel_size=(3, 3), activation="relu"))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Flatten())
model.add(Dense(128, activation=tf.nn.relu))
model.add(BatchNormalization())
model.add(Dropout(0.2))
model.add(Dense(10, activation=tf.nn.softmax))

model.summary()
print(len(model.layers)) # 10

现在,请注意这一点,尽管使用 tf. keras(或像 pytorch 这样的其他框架)我们可以很容易地做这些事情,但我们应该考虑我们在做什么以及为了什么。我不会对此进行过多描述,因为它超出了这个问题的范围。但我强烈建议你查看tf. keras官方code example


Hidden Layer 一词只是早期经常使用的命名约定 (AFAIK),主要用于 Fully Connected Layer(在 CNN 之前)。这就是为什么为了简单起见,我会说忘记这个词。我们应该将层称为trainablenon-trainable,现在更有意义。

在您的模型中,第一个CNN(可训练层)、第二个MaxPool2D(不可训练)、第三个Flatten(不可训练)、第四个Dense(可训练)、第五个Dropout(不可训练) -可训练),最后是第 6 名Dense(可训练)。您还可以看到model. summary() 中的Param # 列,那些是不可训练的层,它们的参数为零 - 该层中没有可训练的变量。假设在您的模型中,第一层表示为,

model.add(Conv2D(28, kernel_size=(3,3), 
                    input_shape = ...))

无论预期的input_shape 是什么,在输入上传递3 x 3 大小的过滤器(总计28)并进行卷积并生成一些特征图。因此,在这一层的末尾,我们将总共获得28 特征图。下一层

model.add(MaxPooling2D(pool_size=(2,2)))

这只是从那些28 特征图中汇集最大值,仅此而已。所以没有计算操作 - 这就是为什么如此不可训练的参数。


隐藏层只是指深度神经网络中位于输入层和输出层之间的层。但是在您的模型中,第一层Conv2D 是隐藏层,它不是输入层。在这里,当我们将input_shape 参数传递给第一个Conv2D 层时,输入层隐式存在。因此,如果我们具体采用 Hidden Layer 命名约定,我们可以说,在您的模型中,有 5 个隐藏层(从第一个 Conv2DDropout) .并且输入层是隐式存在的,输出层是最后一个Dense层。

【讨论】:

  • 非常感谢 M.innat :)...所以第一层是卷积层,第二层:maxpoolin,第三层 faltten 等等,对吗?也不是 maxpooling 和 flatten layers 隐藏层?谢谢和问候:)
  • 更新了答案,请看。
【解决方案2】:

在计算神经网络中的层数时,我们通常只计算卷积层和全连接层。 Pooling Layer 与 Convolutional Layer 一起算作一层,Dropout 是一种正则化技术,所以也不会算作一个单独的层。

作为参考,VGG16 模式定义为 16 层模型。这 16 层只是卷积层和全连接密集层。如果计算所有池化层和激活层,它将变为 41 层模型,但事实并非如此。参考:VGG16,VGG16 Paper

因此,根据您的代码,您有 3 层(1 个具有 28 个神经元的卷积层、1 个具有 128 个神经元的全连接层和 1 个具有 10 个神经元的全连接层)

至于使其成为 10 层网络,您可以在输出层之前添加更多的卷积层或密集层,但对于 MNIST 数据集则不是必需的。

【讨论】:

  • 谢谢伙伴。它真的很有帮助:)
  • 你说 1 个卷积层有 28 个神经元...但是使用 flatten 不会变成 728[28 * 28] 个神经元吗?
  • @AntonyJoy 卷积层只有 28 个神经元,然后将其转换为一维数组作为输入传递给下一层。
  • @AntonyJoy 如果你听说过 VGG16 模型,它被定义为 16 层模型。这 16 层只是卷积层和全连接密集层。如果计算所有池化层和激活层,它将变为 41 层模型,但事实并非如此。我附上一些链接供您参考,VGG16VGG16 Paper。希望您对此有所了解。
猜你喜欢
  • 1970-01-01
  • 2018-09-23
  • 1970-01-01
  • 2016-11-02
  • 1970-01-01
  • 2011-03-28
  • 2019-06-01
  • 2016-09-02
  • 2018-08-14
相关资源
最近更新 更多