keras 在Tensorflow中组合合并两种不同形状的输入,合并组合图像和地标坐标

flvlnr44  于 2023-10-19  发布在  其他
关注(0)|答案(1)|浏览(124)

我目前越来越沮丧,试图合并两个不同的形状输入层,我想给予我的模型作为输入。

我拥有:

我有以下两个输入

X_train # shape (120, 224, 224, 1)
landmarks_x_train # shape (120, 478, 3)
X_val # shape (40, 224, 224, 1)
landmarks_x_val # shape (40, 478, 3)

因此,在这个例子中,我有120张灰度图像,大小为(224,224),它们都有一个地标“集”,其中有478个地标,具有x,y,z坐标。
数字120只是一个例子,真实的数据集具有更多的图像和每个图像的地标。
作为一个模型,我自己用input_shape=(224, 224, 1)构建了一个ResNet50。
x = Dense(7, activation='softmax')(x)的输出
在训练模型之前,我创建一个ImageDataGenerator流,如下所示:

datagen = ImageDataGenerator(horizontal_flip=True, fill_mode='nearest')
datagen.fit(X_train_with_landmarks)

batch_size = 16
train_flow = datagen.flow(X_train, y_train, batch_size=batch_size)
val_flow = datagen.flow(X_val, y_val, batch_size=batch_size)

我的训练步骤是这样的:

model = ResNet.get_resnet_50_model() # my class where the model is located

optimizer = Adam(learning_rate=0.01)

model.compile(optimizer=optimizer, loss='categorical_crossentropy', metrics=['accuracy'])

num_epochs = 5

history = model.fit(train_flow,
                    steps_per_epoch=len(X_train) / batch_size,
                    epochs=num_epochs,
                    verbose=2,
                    validation_data=val_flow,
                    validation_steps=len(X_val) / batch_size)

问题所在:

我现在想把这两个输入合并结合起来,我必须建立一个更好的模型,而不仅仅是像现在这样依赖于图像。
我已经尝试了几件事,我发现在网络上,也问ChatGPT,但没有运气。
最有前途的方法是两个合并,这两个与Keras Concatenate层,像这样:

model = ResNet.get_resnet_50_model()

landmarks_input = Input(shape=(landmarks_x_train.shape[1],), name='landmarks_input')

model_output = model.output

combined_input = concatenate([model_output, landmarks_input], name='combined_input')

model = Model(inputs=[model.input, landmarks_input], outputs=combined_input)

这给了我一个模型,但我无法调整model.fit()进程以使其运行。

结论:

所以现在我希望有人能帮我把这两个输入合并结合起来,这样我就可以在这两个输入上训练模型了。

puruo6ea

puruo6ea1#

在keras中,可以使用keras函数API集成混合数据和多个输入。
从架构的Angular 来看,您将引入两个输入流,进入密集层,然后您将连接这些输入流。

# define two sets of inputs
inputA = Input(shape=(32,))
inputB = Input(shape=(128,))

# the first branch operates on the first input
x = Dense(8, activation="relu")(inputA)
x = Dense(4, activation="relu")(x)
x = Model(inputs=inputA, outputs=x)

# the second branch opreates on the second input
y = Dense(64, activation="relu")(inputB)
y = Dense(32, activation="relu")(y)
y = Dense(4, activation="relu")(y)
y = Model(inputs=inputB, outputs=y)

# combine the output of the two branches
combined = concatenate([x.output, y.output])

# apply a FC layer and then a regression prediction on the
# combined outputs
z = Dense(2, activation="relu")(combined)
z = Dense(1, activation="linear")(z)

# our model will accept the inputs of the two branches and
# then output a single value
model = Model(inputs=[x.input, y.input], outputs=z)

完整的教程可以在here找到。

  • 注意:* 如果您的界标在图像尺寸内,您还可以为图像生成一个额外的通道,其中具有界标的像素获得相关的深度/ z值。然后,您的输入是具有两个通道的图像。

相关问题