【问题标题】:Keras - CNN Regression + additional input into final fully-connected layersKeras - CNN 回归 + 最终全连接层的附加输入
【发布时间】:2017-12-06 18:49:56
【问题描述】:

假设我试图从个人资料图片中猜测 AGE。在执行卷积/池化之后,我想在进行最终预测之前添加另一条信息,例如心率。

所以,而不是 profile picture --> Convolutions/Pooling --> 全连接层 --> AGE

我想要: 个人资料图片 --> 卷积/池化 --> 全连接层,其中添加了有关心率的新输入 --> 年龄

为此,我创建了如下函数:

def Add_to_FinalLayers(X, Additional):
    X = concatenate([X, Additional])
    return X

def AgeModel(input_shape):
    X_input = Input(input_shape)
    X = ZeroPadding2D((3,3))(X_input)
    X = Conv2D(32, (7,7) strides=(1,1), name ='conv0')(X)
    X = BatchNormalization(axis =3, name = 'bn0')(X)
    X = Activation('relu')(X)
    X = MaxPooling2D((2,2), name='max_pool')(X)
    X = Flatten()(X)
    X = Add_to_FinalLayers(X, HeartRateData_train)
    X = Dense(1, activation='linear', name='fc')(X)
    model = Model(inputs=[X_input, HeartRate_train], outputs=X,   name='AgeModel')
    return model

ageModel = AgeModel(X_train.shape[1:])
ageModel.compile(optimizer="RMSprop", loss="mse", metrics=["mse"])
ageModel.fit(x=[X_train,HeartRate_train], y=Y_train, epochs=30, batch_size=32)
preds = happyModel.predict(X_test)

我的数据大小是,

number of training examples = 600
number of test examples = 150
X_train shape: (600, 64, 64, 3)
Y_train shape: (600, 1)
X_test shape: (150, 64, 64, 3)
Y_test shape: (150, 1)
HeartRate_train shape: (600, 1)
HeartRate_test shape: (150, 1)

我收到的错误消息是:

ValueError: Error when checking input: expected input_22 to have shape (None, 10) but got array with shape (600, 1)
ValueError: The model expects 2 arrays, but only received one array.  Found: array with shape (150, 64, 64, 3)
ValueError: Error when checking model input: the list of Numpy arrays that you are passing to your model is not the size the model expected.  Expected to see 1 arrays) but in stead got the following list of 2 arrays:...

任何建议将不胜感激。谢谢你。

【问题讨论】:

  • 首先,您需要将Heartbeat 定义为模型的输入,方法是将其指定为input2 = Input(shape=[1], name='heart_rate')。然后,您可以在 flatten 层之后将其连接为X = Concatenate(name='concat_layer')[X, input_2]
  • 亲爱的 Nain,感谢您的友好回复。根据您的建议,我在模型定义中添加了 Input2 = Input(shape=[1]) ,然后在展平层之后添加了 X=concatenate(name='concat_layer')[X, Input2] 。但我得到了同样的错误。是不是因为我在这里创建模型实例时只传递了 X_train:ageModel = AgeModel(X_train.shape[1:])?将 X_train 和 HeartRate_train 都传递给 ageModel 的最佳方法是什么?
  • 其实,它似乎工作。但是,当我进行预测时,我注意到我需要做preds = ageModel.predict([X_test, HeartRate_test])
  • 是的,您还需要在测试时发送两个数组(图像和心率),因为当您定义模型时,它接受两个输入和一个输出。如果您的问题得到解决,请告诉我,以便我可以将其放在答案部分
  • 嗨,Nain,非常感谢。是的,我听从了您的建议,问题已经解决。 =)

标签: keras keras-layer


【解决方案1】:

首先,您需要将 Heartbeat 定义为模型的输入,方法是:

input2 = Input(shape=[1], name='heart_rate')

然后,您可以在 flatten 层之后将其连接为:

 X = Concatenate(name='concat_layer')[X, input_2]

您的模型现在接受两个输入,一个图像和一个心跳。确保你在测试时都通过了,以获得预测。

【讨论】:

    猜你喜欢
    • 2016-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-21
    • 2019-03-18
    相关资源
    最近更新 更多