我正在尝试使用 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/

10-12 21:37