如果你打印你的模型的.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 之前)。这就是为什么为了简单起见,我会说忘记这个词。我们应该将层称为trainable 和non-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 个隐藏层(从第一个 Conv2D 到 Dropout) .并且输入层是隐式存在的,输出层是最后一个Dense层。