【问题标题】:keras functional api and multiple merge layerskeras 功能 api 和多个合并层
【发布时间】:2017-03-04 23:52:31
【问题描述】:

我正在尝试使用 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 层。 我做错了吗?

【问题讨论】:

    标签: python machine-learning deep-learning keras


    【解决方案1】:

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

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

    【讨论】:

    • 你能举个例子吗? keras 的合并层结构我还是没搞懂
    • 什么情况下的一个例子?这取决于您要构建什么,构建模型时您想到的网络架构是什么? :) 我很乐意提供帮助,但我需要了解您的问题在哪里
    • 添加了一个合并层的信息
    猜你喜欢
    • 2017-07-19
    • 1970-01-01
    • 2017-11-26
    • 2018-08-18
    • 2018-12-23
    • 2022-01-23
    • 2021-02-22
    • 2018-09-26
    • 2017-10-25
    相关资源
    最近更新 更多