[英]how does input_shape in keras.applications work?
我已經閱讀過Keras 文檔,但仍無法確定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作為后端。
1.在卷積層中,輸入大小不影響權重的數量,因為權重的數量由內核矩陣維確定。 較大的輸入大小會導致較大的輸出大小,但不會導致權重增加。
這意味着,第二個模型的卷積層的輸出大小將比第一個模型的大,這將增加后續密集層中的權重數。 但是,如果您看一下DenseNet的體系結構,則會注意到在所有卷積層之后都有一個GlobalMaxPooling2D
層,該層將每個輸出通道的所有值取平均值。 這就是為什么無論輸入形狀如何,DenseNet的輸出大小都為1024的原因。
2.是的,該模型仍然可以使用。 我對此不太確定,但是我猜想單個頻道將被廣播(復制)以填充所有三個頻道。 至少這就是這些事情通常的處理方式(請參閱示例tensorflow或numpy )。
DenseNet
由兩部分組成:卷積部分和全局池化部分。
卷積部分可訓練權重的數量不取決於輸入形狀。
通常,分類網絡應采用完全連接的層來推斷分類,但是,在DenseNet
,使用global pooling
並且不會帶來任何可訓練的權重。
因此,輸入形狀不會影響整個網絡的權數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.