哈嘍,大家好,我回來了。
在家辦公先用Keras寫個CNN,然後複製粘貼幾層,發現沒改每層的命名,發現報錯。
ValueError: The name "BN" is used 3 times in the model. All layer names should be unique.
因此都修改後沒毛病了。
import keras
inputs=keras.Input(shape=(229,229,3),name='input')
x=keras.layers.Conv2D(32,kernel_size=(3,3),strides=(2,2),padding='valid',name='Conv2D1')(inputs)
x=keras.layers.BatchNormalization(name='BN1')(x)
x=keras.layers.MaxPool2D(pool_size=(2,2),strides=(2,2),padding='valid',name='MaxPool1')(x)
x=keras.layers.Conv2D(64,kernel_size=(3,3),strides=(2,2),padding='valid',name='Conv2D2')(x)
x=keras.layers.BatchNormalization(name='BN2')(x)
x=keras.layers.MaxPool2D(pool_size=(2,2),strides=(2,2),padding='valid',name='MaxPool2')(x)
x=keras.layers.Conv2D(128,kernel_size=(3,3),strides=(2,2),padding='valid',name='Conv2D3')(x)
x=keras.layers.BatchNormalization(name='BN3')(x)
outputs=keras.layers.MaxPool2D(pool_size=(2,2),strides=(2,2),padding='valid',name='MaxPool3')(x)
model=keras.Model(inputs=inputs,outputs=outputs)
model.summary()
Layer (type) Output Shape Param #
=================================================================
input (InputLayer) (None, 229, 229, 3) 0
_________________________________________________________________
Conv2D1 (Conv2D) (None, 114, 114, 32) 896
_________________________________________________________________
BN1 (BatchNormalization) (None, 114, 114, 32) 128
_________________________________________________________________
MaxPool1 (MaxPooling2D) (None, 57, 57, 32) 0
_________________________________________________________________
Conv2D2 (Conv2D) (None, 28, 28, 64) 18496
_________________________________________________________________
BN2 (BatchNormalization) (None, 28, 28, 64) 256
_________________________________________________________________
MaxPool2 (MaxPooling2D) (None, 14, 14, 64) 0
_________________________________________________________________
Conv2D3 (Conv2D) (None, 6, 6, 128) 73856
_________________________________________________________________
BN3 (BatchNormalization) (None, 6, 6, 128) 512
_________________________________________________________________
MaxPool3 (MaxPooling2D) (None, 3, 3, 128) 0
=================================================================
Total params: 94,144
Trainable params: 93,696
Non-trainable params: 448
顯而易見,每次卷積後的厚度(channel)都會改變,而BN層和Pool層不改變厚度;並且卷積核(filters)個數恰好是該層的厚度,除非有卷積出現或RNN
此外也可查看模型的輸入和輸出是什麼,包括節點名和shape
>>> model.inputs
[<tf.Tensor 'input:0' shape=(?, 229, 229, 3) dtype=float32>]
>>> model.outputs
[<tf.Tensor 'MaxPool3/MaxPool:0' shape=(?, 3, 3, 128) dtype=float32>]
另外有相關問題可以加入QQ羣討論,不設微信羣
QQ羣:868373192
語音圖像視頻深度-學習羣