我经历过Keras documentation,但是我仍然无法弄清楚input_shape
参数的工作原理,以及为什么在传递参数时它不会更改DenseNet模型的参数数量的原因自定义输入形状。一个例子:
import keras
from keras import applications
from keras.layers import Conv3D, MaxPool3D, Flatten, Dense
from keras.layers import Dropout, Input, BatchNormalization
from keras import Model
# define model 1
INPUT_SHAPE = (224, 224, 1) # used to define the input size to the model
n_output_units = 2
activation_fn = 'sigmoid'
densenet_121_model = applications.densenet.DenseNet121(include_top=False, weights=None, input_shape=INPUT_SHAPE, pooling='avg')
inputs = Input(shape=INPUT_SHAPE, name='input')
model_base = densenet_121_model(inputs)
output = Dense(units=n_output_units, activation=activation_fn)(model_base)
model = Model(inputs=inputs, outputs=output)
model.summary()
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input (InputLayer) (None, 224, 224, 1) 0
_________________________________________________________________
densenet121 (Model) (None, 1024) 7031232
_________________________________________________________________
dense_1 (Dense) (None, 2) 2050
=================================================================
Total params: 7,033,282
Trainable params: 6,949,634
Non-trainable params: 83,648
_________________________________________________________________
# define model 2
INPUT_SHAPE = (512, 512, 1) # used to define the input size to the model
n_output_units = 2
activation_fn = 'sigmoid'
densenet_121_model = applications.densenet.DenseNet121(include_top=False, weights=None, input_shape=INPUT_SHAPE, pooling='avg')
inputs = Input(shape=INPUT_SHAPE, name='input')
model_base = densenet_121_model(inputs)
output = Dense(units=n_output_units, activation=activation_fn)(model_base)
model = Model(inputs=inputs, outputs=output)
model.summary()
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input (InputLayer) (None, 512, 512, 1) 0
_________________________________________________________________
densenet121 (Model) (None, 1024) 7031232
_________________________________________________________________
dense_2 (Dense) (None, 2) 2050
=================================================================
Total params: 7,033,282
Trainable params: 6,949,634
Non-trainable params: 83,648
_________________________________________________________________
理想情况下,随着输入形状的增加,参数的数量应增加,但是如您所见,它们保持完全相同。因此,我的问题是:
input_shape
的变化而变化?input_shape
中仅定义了一个渠道,在这种情况下我的模型训练会怎样?该文档指出以下内容:input_shape:可选的形状元组,仅在include_top时指定 为False(否则输入形状必须为(224,224,3)( 'channels_last'数据格式)或(3,224,224)(带有'channels_first' 数据格式)。它应该有3个输入通道,宽度和 高度应不小于32。 (200,200,3)将是一个 有效值。
但是,当我使用此配置运行模型时,它运行没有任何问题。可能有我遗漏的东西吗?
使用Keras 2.2.4和Tensorflow 1.12.0作为后端。
答案 0 :(得分:1)
1。 在卷积层中,输入大小不影响权重的数量,因为权重的数量由内核矩阵维确定。较大的输入大小会导致较大的输出大小,但不会导致权重增加。
这意味着,第二个模型的卷积层的输出大小将大于第一个模型的卷积层,这将增加随后的密集层的权重数。但是,如果您看一下DenseNet的体系结构,则会注意到在所有卷积层之后有一个GlobalMaxPooling2D
层,该层将每个输出通道的所有值取平均值。这就是为什么无论输入形状如何,DenseNet的输出大小都为1024的原因。
2。 是的,该模型仍然可以使用。我对此不太确定,但是我猜想单个频道将被广播(复制)以填充所有三个频道。至少这就是这些事情通常的处理方式(请参阅示例tensorflow或numpy)。
答案 1 :(得分:0)
DenseNet
由两部分组成:卷积部分和全局池化部分。
卷积部分可训练权重的数量不取决于输入形状。
通常,分类网络应采用完全连接的层来推断分类,但是,在DenseNet
中使用global pooling
,并且不会带来任何可训练的权重。
因此,输入形状不会影响整个网络的权数。