我正在尝试使用 keras 设计一个神经网络。与定义的层相比,model.summary() 输出是不同的
import numpy as np
np.random.seed(1337)
from keras.models import Model
from keras.layers import Input, Convolution2D, MaxPooling2D, Activation, Flatten, merge
from keras import backend as K
K.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,然后将其提供给 seq8,而 seq8 不会去任何地方。
你模型树的结构有问题。
在总结的那个中,他们从 output=out
获取了导致 input=inp
的所有层,未在该“路径”中使用的层将不会成为模型图的一部分。
通过 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”行中阅读我刚刚解释的内容关于python - keras 功能 api 和多个合并层,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42602773/