簡體   English   中英

keras.applications中的input_shape如何工作?

[英]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
_________________________________________________________________

理想情況下,隨着輸入形狀的增加,參數的數量應增加,但是如您所見,它們保持完全相同。 因此,我的問題是:

  1. 為什么參數的數量不隨input_shape變化而變化?
  2. 我在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.是的,該模型仍然可以使用。 我對此不太確定,但是我猜想單個頻道將被廣播(復制)以填充所有三個頻道。 至少這就是這些事情通常的處理方式(請參閱示例tensorflownumpy )。

DenseNet由兩部分組成:卷積部分和全局池化部分。

卷積部分可訓練權重的數量不取決於輸入形狀。

通常,分類網絡應采用完全連接的層來推斷分類,但是,在DenseNet ,使用global pooling並且不會帶來任何可訓練的權重。

因此,輸入形狀不會影響整個網絡的權數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM