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

两种不同输入类型(图像和值)的Keras神经网络

  •  3
  • KatharsisHerbie  · 技术社区  · 8 年前

    目前,我有一个工作的CNN,它从给定的图像输出一个从-1到1的值。现在我还想把给定的值输入到网络中,因为它们可以真正提高输出的准确性。这项工作当然不能用CNN完成,但应该可以将它们添加到完全连接的层中,不是吗? 如果有人告诉我如何处理Keras,那就太好了。

    我现在的CNN:

    model = Sequential()
    model.add(Lambda(lambda x: x/127.5-1.0, input_shape=(66,200,3)))
    model.add(Conv2D(24, 5, 5, activation='elu', subsample=(2, 2)))
    model.add(Conv2D(36, 5, 5, activation='elu', subsample=(2, 2)))
    model.add(Conv2D(48, 5, 5, activation='elu', subsample=(2, 2)))
    model.add(Conv2D(64, 3, 3, activation='elu'))
    model.add(Conv2D(64, 3, 3, activation='elu'))
    model.add(Dropout(0.5))
    model.add(Flatten())
    model.add(Dense(100, activation='elu'))
    model.add(Dense(50, activation='elu'))
    model.add(Dense(10, activation='elu'))
    model.add(Dense(1))
    model.summary()
    

    我认为它应该如何工作: enter image description here ~修改的图形来自 https://blog.insightdatascience.com/classifying-e-commerce-products-based-on-images-and-text-14b3f98f899e

    2 回复  |  直到 8 年前
        1
  •  4
  •   parsethis    8 年前

    Diego给出了答案,我将使用 Functional API 。假设您有3个想要的特性 添加到每个图像。每个特征都是一个实数,所以如果我们将它们串联起来,我们就有一个包含三个分量的特征向量。

    from keras.layers import ( Conv2D, Flatten, Lambda, Dense, concatenate,
                             Dropout, Input )
    from keras.models import Model
    
    image = np.random.rand(10, 66, 200, 3)
    feature = np.random.rand(10, 3) # feature vector
    y = np.random.normal(0, 1, (10, 1))
    
    
    image_input = Input(shape=(66, 200, 3))
    aux_input = Input(shape=(3,))
    
    lamb = Lambda(lambda x: x/127.5-1.0, input_shape=(66,200,3))(image_input)
    cov1 = Conv2D(24, 5, 5, activation='elu', subsample=(2, 2))(lamb)
    cov2 = Conv2D(36, 5, 5, activation='elu', subsample=(2, 2))(cov1)
    cov3 = Conv2D(48, 5, 5, activation='elu', subsample=(2, 2))(cov2)
    cov4 = Conv2D(64, 3, 3, activation='elu')(cov3)
    cov5 = Conv2D(64, 3, 3, activation='elu')(cov4)
    dropout = Dropout(0.5)(cov5)
    flatten = Flatten()(dropout)
    
    # Here we add in the feature vectors 
    merge = concatenate([flatten, aux_input])
    
    d1 = Dense(100, activation='elu')(merge)
    d2 = Dense(50, activation='elu')(d1)
    d3 = Dense(10, activation='elu')(d2)
    out = Dense(1)(d3)
    
    model = Model(inputs=[image_input, aux_input], outputs=[out])
    model.compile(loss='mse', optimizer='rmsprop')
    model.fit([image, feature], y)
    
        2
  •  1
  •   Diego Aguado    8 年前

    如果您试图在图像上复制模型,则不能使用 Sequential 来自Keras。

    您需要使用 Model ,将非常相似,但有一些MOD:

    • 添加文本向量作为额外的占位符/输入
    • 将CNN的输出与矢量化文本的FC层的输出合并
    • 最后,添加一些其他FC层和输出