我正在尝试使用keras设计一个神经网络。模型的model.summary()输出与定义的层不同
import numpy as npnp.random.seed(1337) from keras.models import Modelfrom keras.layers import Input, Convolution2D, MaxPooling2D, Activation, Flatten, mergefrom keras import backend as KK.set_image_dim_ordering('th')input_shape = (3, 225, 225)inp = Input(input_shape)seq0 = MaxPooling2D(pool_size=(2, 2), strides=(2, 2), border_mode="same")(inp)seq1 = Convolution2D(32, 1, 1, border_mode="same", activation="relu")(seq0)seq2 = Convolution2D(32, 1, 1, border_mode="same", activation="relu")(seq1)seq3 = merge([seq2, seq1], mode="concat", concat_axis=1)seq4 = Convolution2D(32, 1, 1, border_mode="same", activation="relu")(seq3)seq5 = merge([seq1, seq3], mode="concat", concat_axis=1)seq6 = Convolution2D(128, 5, 5, border_mode="same", activation="relu")(seq5)seq7 = merge([seq4, seq3], mode="concat", concat_axis=1)seq8 = Convolution2D(512, 3, 3, border_mode="same", activation="relu")(seq7)seq9 = merge([seq5, seq2], mode="concat", concat_axis=1)seq = Flatten()(seq9)out = Activation('softmax')(seq)model = Model(input=inp, output=out) model.summary()
model.summary() 输出
Layer (type) Output Shape Param # Connected to ====================================================================================================input_1 (InputLayer) (None, 3, 225, 225) 0 ____________________________________________________________________________________________________maxpooling2d_1 (MaxPooling2D) (None, 3, 113, 113) 0 input_1[0][0] ____________________________________________________________________________________________________convolution2d_1 (Convolution2D) (None, 32, 113, 113) 128 maxpooling2d_1[0][0] ____________________________________________________________________________________________________convolution2d_2 (Convolution2D) (None, 32, 113, 113) 1056 convolution2d_1[0][0] ____________________________________________________________________________________________________merge_1 (Merge) (None, 64, 113, 113) 0 convolution2d_2[0][0] convolution2d_1[0][0] ____________________________________________________________________________________________________merge_2 (Merge) (None, 96, 113, 113) 0 convolution2d_1[0][0] merge_1[0][0] ____________________________________________________________________________________________________merge_4 (Merge) (None, 128, 113, 113) 0 merge_2[0][0] convolution2d_2[0][0] ____________________________________________________________________________________________________flatten_1 (Flatten) (None, 1634432) 0 merge_4[0][0] ____________________________________________________________________________________________________activation_1 (Activation) (None, 1634432) 0 flatten_1[0][0] ====================================================================================================
在model.summary()输出中,seq4、seq6、seq8层缺失。我做错了什么吗?
回答:
你没有使用这些层来计算输出。
以seq4为例:你将它输入到seq7,而seq7又输入到seq8,但seq8并没有连接到任何地方。
你的模型结构树存在问题。
在总结的模型中,他们只考虑了从input=inp
到output=out
的路径中使用的层,那些未在该路径中使用的层不会成为模型图的一部分。
通过seq4、seq6、seq7和seq8的流程并没有导向模型的输出。
这对你有帮助吗?
编辑:
合并层的工作方式可以参考你代码中的这个例子:
seq3 = merge([seq2, seq1], mode="concat", concat_axis=1)
在这里,你取出seq2和seq1层的输出,它们的shapes = (None,32,113,113)
。这是该层的输入,来自seq2和seq1的两个不同的张量。你指定希望沿着轴1连接这些4D张量。因此,该合并层的输出将是shape = (None,64,113,113)
。在连接过程中,两个32被加在一起。你可以在model.summary()
的”merge_1″行看到我刚刚解释的内容