keras.layers傳遞"input_shape"參數(shù)給第一層
背景
在keras.layers的Sequential 順序模型API中,順序模型是多個(gè)網(wǎng)絡(luò)層的線性堆疊
model.layers 是包含模型網(wǎng)絡(luò)層的展平列表。
model.inputs 是模型輸入張量的列表。
model.outputs 是模型輸出張量的列表。
但是keras.layers的網(wǎng)絡(luò)層(包括Dense、LSTM、ConvLSTM2D等)沒(méi)有顯式存在Input_shape參數(shù)!
指定輸入數(shù)據(jù)的尺寸
模型需要知道它所期望的輸入的尺寸。出于這個(gè)原因,順序模型中的第一層(后面的層可以自動(dòng)地推斷尺寸)需要接收關(guān)于其輸入尺寸的信息。有幾種方法來(lái)做到這一點(diǎn):
傳遞一個(gè)input_shape 參數(shù)給第一層。它是一個(gè)表示尺寸的元組(一個(gè)整數(shù)或None 的元組,其中None 表示可能為任何正整數(shù))。在input_shape 中不包含數(shù)據(jù)的batch 大小。
某些2D 層,例如Dense,支持通過(guò)參數(shù)input_dim 指定輸入尺寸,某些3D 時(shí)序?qū)又С謎nput_dim 和input_length 參數(shù)。
如果你需要為你的輸入指定一個(gè)固定的batch 大小,你可以傳遞一個(gè)batch_size 參數(shù)給一個(gè)層。如果你同時(shí)將batch_size=32 和input_shape=(6,8) 傳遞給一個(gè)層,那么每一批輸入的尺寸就為(32,6,8)
下面兩種方法是相同的:
model = Sequential()
model.add(Dense(32, input_shape=(784,)))
model = Sequential()
model.add(Dense(32, input_dim=784))
核心網(wǎng)絡(luò)層沒(méi)有顯式的input_shape, input_dim參數(shù),如何傳遞
input_shape, input_dim參數(shù)是通過(guò)**kwargs傳遞的。以LSTM為例:
LSTM的API接口,繼承自recurrent.LSTM;
recurrent.LSTM繼承自RNN(Layer):里面就有input_shape的來(lái)源;
RNN(Layer)繼承自Layer:里面有可以允許的字典的鍵。
@keras_export('keras.layers.LSTM', v1=[])
class LSTM(recurrent.DropoutRNNCellMixin, recurrent.LSTM):
@keras_export(v1=['keras.layers.LSTM'])
class LSTM(RNN):
@keras_export('keras.layers.RNN')
class RNN(Layer):
??? if 'input_shape' not in kwargs and (
??????? 'input_dim' in kwargs or 'input_length' in kwargs):
????? input_shape = (kwargs.pop('input_length', None),
???????????????????? kwargs.pop('input_dim', None))
????? kwargs['input_shape'] = input_shape
?????
@keras_export('keras.layers.Layer')
class Layer(module.Module, version_utils.LayerVersionSelector):
allowed_kwargs = {
??????? 'input_dim',
??????? 'input_shape',
??????? 'batch_input_shape',
??????? 'batch_size',
??????? 'weights',
??????? 'activity_regularizer',
??????? 'autocast',
??? }

**kwargs 是將一個(gè)可變的關(guān)鍵字參數(shù)的字典傳給函數(shù)實(shí)參,同樣參數(shù)列表長(zhǎng)度可以為0或?yàn)槠渌怠O旅孢@段代碼演示了如何使用kwargs。
