[英]How to flatten a nested model? (keras functional API)
我已經使用keras Model功能API定義了一個簡單的模型。 它的層之一是完全順序的模型,因此我得到了一個嵌套的層結構(請參見下圖)。
如何將此嵌套層結構轉換為平面層結構? (使用腳本,而不是手動...)
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input_1 (InputLayer) (None, 32, 32, 1) 0
_________________________________________________________________
sequential_1 (Sequential) (None, 8, 8, 12) 720
_________________________________________________________________
flatten_1 (Flatten) (None, 768) 0
_________________________________________________________________
dense_1 (Dense) (None, 1) 769
=================================================================
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input_1 (InputLayer) (None, 32, 32, 1) 0
_________________________________________________________________
conv2d_1 (Conv2D) (None, 32, 32, 6) 60
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 16, 16, 6) 0
_________________________________________________________________
conv2d_2 (Conv2D) (None, 16, 16, 6) 330
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 8, 8, 6) 0
_________________________________________________________________
flatten_1 (Flatten) (None, 384) 0
_________________________________________________________________
dense_1 (Dense) (None, 1) 385
=================================================================
生成嵌套層結構的代碼:
def create_network_with_one_subnet():
# define subnetwork
subnet = keras.models.Sequential()
subnet.add(keras.layers.Conv2D(6, (3, 3), padding='same'))
subnet.add(keras.layers.MaxPool2D())
subnet.add(keras.layers.Conv2D(12, (3, 3), padding='same'))
subnet.add(keras.layers.MaxPool2D())
#subnet.summary()
# define complete network
input_shape = (32, 32, 1)
net_in = keras.layers.Input(shape=input_shape)
net_out = subnet(net_in)
net_out = keras.layers.Flatten()(net_out)
net_out = keras.layers.Dense(1)(net_out)
net_complete = keras.Model(inputs=net_in, outputs=net_out)
net_complete.compile(loss='binary_crossentropy',
optimizer=keras.optimizers.Adam(lr=0.001),
metrics=['acc'],
)
net_complete.summary()
return net_complete
啊,這比預期的容易得多。 在搜索了正確的關鍵字后,可以從此處找到解決方案: https ://groups.google.com/forum/#!msg/keras-users/lJcVK25YDuc/atB6TfwqBAAJ
def flatten_model(model_nested):
layers_flat = []
for layer in model_nested.layers:
try:
layers_flat.extend(layer.layers)
except AttributeError:
layers_flat.append(layer)
model_flat = keras.models.Sequential(layers_flat)
return model_flat
更好的解決方案,用於處理多層以上的嵌套模型:
def flatten_model(model_nested):
def get_layers(layers):
layers_flat = []
for layer in layers:
try:
layers_flat.extend(get_layers(layer.layers))
except AttributeError:
layers_flat.append(layer)
return layers_flat
model_flat = tfk.models.Sequential(
get_layers(model_nested.layers)
)
return model_flat
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.