keras功能api和多个合并层

时间:2017-03-04 23:52:32

标签: python machine-learning deep-learning keras

我正在尝试使用keras设计神经网络。与定义的图层相比,model.summary()输出不同

close()

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()输出中缺少seq4,seq6,seq8层。 我做错了吗?

1 个答案:

答案 0 :(得分:2)

您没有使用它们来计算输出。

以seq4为例:你把它喂给seq7,它被送到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”行中阅读我刚才解释的内容