代码之家  ›  专栏  ›  技术社区  ›  Whoami

无法在keras中连接两个输入层。

  •  1
  • Whoami  · 技术社区  · 6 年前

    import tensorflow as tf 
    
    from keras.layers import Input, Dense
    from keras.models import Model, Sequential
    from keras.layers import Conv2D, Concatenate
    from keras.utils.vis_utils import plot_model
    
    if __name__ == '__main__':
        imgRows = imgCols = 28
        print ("ImgRow and imgCols " , imgRows, imgCols)
        inputLayer = Input(shape=( 1,28,28))
    
        conv1 = Conv2D(64,(3,3),strides=1, padding="same", activation='relu') (inputLayer)
    
        #Residual 1 
        skip = Conv2D(128, (1,1), strides=1, padding="same", activation='relu') (conv1)
        conv1 = Conv2D(128, (3,3), strides=3, padding="same", activation='relu') (skip)
        conv1 = Conv2D(128, (3,3), strides=3, padding="same", activation='relu') (conv1)
        r1= Concatenate([skip, conv1])
    
    
        #residual 2 
        conv1 = Conv2D(128, (3,3), strides=3, padding="same", activation='relu') (r1)
        conv1 = Conv2D(128, (3,3), strides=3, padding="same", activation='relu') (conv1)
    
        conv1= Concatenate([r1, conv1])
    
        # Residual 3 
        skip = Conv2D(256, (1,1), strides=1, padding="same", activation='relu') (conv1)
        conv1 = Conv2D(256, (3,3), strides=3, padding="same", activation='relu') (conv1)
        conv1 = Conv2D(256, (3,3), strides=3, padding="same", activation='relu') (conv1)
        conv1= Concatenate([skip, conv1])
        out =  Conv2D(1, (1,1), strides=1, padding="same", activation='sigmoid') (conv1)
    
    
    
        #model =  Sequential()
        #model.add (inputLayer)
        #model.add ( conv1)
    
        model = Model(input=inputLayer, output=conv1)
    
        model.compile(optimizer=Nadam(lr=1e-5), loss="mean_square_error")
    
        plot_model (model, to_file="./keestu_model.png", show_shapes=True)
    

    我得到以下错误:

    错误消息是:

    ValueError: Layer conv2d_5 was called with an input that isn't a 
    symbolic tensor. Received type: <class 'keras.layers.merge.Concatenate'>. 
    Full input: [<keras.layers.merge.Concatenate object at 0x7fd543841590>]. 
           All inputs to the layer should be tensors.
    

    问题

    错误消息对我来说非常清楚,第5层希望它的输入是张量对象,而不是串联对象。但是我怎样才能修复它呢?

    1 回复  |  直到 6 年前
        1
  •  2
  •   nuric    6 年前

    那是因为 Concatenate 是一个具有两个API版本的层类:

    • Concatenate()([tensor1, tensor2])
    • concatenate([tensor1, tensor2]) 将实现相同的目标,但为您创建一个隐式实例。从 documentation

      连接(输入,轴=-1):连接层的功能接口。

    顺便说一下 merge layers