python - 连接 CNN 以比较两个图像
问题描述
我正在训练一个 CNN 来比较两个图像。然后,CNN 可以判断我放入 CNN 中的新图像是否相等。因此,我通过 cv2 连接图像,以便我有形状 (330,530,6) 的图像(在 rgb 中),或者像我会在灰度 (330,530,2) 中那样做。这对我来说很好,但我想知道如果我在将两个模型展平后连接两个模型,CNN 是如何工作的。我正在使用 keras 顺序模型。有没有办法在不改变一切的情况下连接这两个模型?因为我在 fit 方法中给出了数据,所以我不确定我如何将这两个数据交给每个模型。
这是我使用的模型:
CNN = Sequential()
CNN.add(layers.Conv2D(32,(3,3),activation='relu',kernel_regularizer=regularizers.l2(l2Reg),input_shape=(330,530,2)))
CNN.add(layers.MaxPool2D(pool_size=(2, 2)))
CNN.add(layers.Conv2D(32,(3,3),activation='relu',kernel_regularizer=regularizers.l2(l2Reg)))
CNN.add(layers.MaxPool2D(pool_size=(3, 3)))
CNN.add(layers.Conv2D(64,(3,3),activation='relu',kernel_regularizer=regularizers.l2(l2Reg)))
CNN.add(layers.MaxPool2D(pool_size=(3, 3)))
CNN.add(layers.Conv2D(64,(3,3),activation='relu',kernel_regularizer=regularizers.l2(l2Reg)))
CNN.add(layers.MaxPool2D(pool_size=(3, 3)))
CNN.add(layers.Flatten())
CNN.add(layers.Dropout(0.5))
CNN.add(layers.Dense(128,activation='relu',kernel_regularizer=regularizers.l2(l2Reg)))
CNN.add(layers.Dense(2,activation='softmax'))
CNN.summary()
CNN.compile(optimizer=optimizers.RMSprop(lr=1e-4),loss='categorical_crossentropy',metrics=['accuracy'])
history=CNN.fit(XTrain,YTrain,epochs=40,batch_size=32,validation_split=0.15)
scores = CNN.evaluate(XTest,YTest,batch_size=32)
print("Accuracy: %.2f%%" % (scores[1]*100))
CNN.save("AnodenerkennungDreiV")
解决方案
您可以创建一个输入列表,在您的情况下有 2 个项目,比如说'image1'和'image2'。然后,您可以为每个以Flatten层结尾的图像创建卷积层和池化层的分支。
以 330x530 灰度图像为例:
import numpy as np
from keras.utils import plot_model
from keras.models import Model
from keras.layers import Conv2D, MaxPool2D, Flatten, Input, concatenate, Dense
inputs = [Input(shape=(330,530,1), name='image1'), Input(shape=(330,530,1), name='image2')]
flattened_layers = []
for input in inputs:
conv_layer = Conv2D(32,(3,3),activation='relu')(input)
conv_layer = MaxPool2D(pool_size=(2,2))(conv_layer)
# note that previous layer is used as input for creating the next layer,
# you'll need to do this for every layer.
# add more layers here
flattened_layers.append(Flatten()(conv_layer))
output = concatenate(flattened_layers, axis=0) #you have to check which axis you want to use here
#add more layers here
output = Dense(2,activation='softmax')(output)
model = Model(inputs=inputs, outputs=output)
model.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy'])
plot_model(model, "C:/help_me_pls/example_model.png", show_shapes=True)
要将数据输入此模型,您需要一个字典作为 X 值。X['image1']
应该包含所有第一张图片和X['image2']
所有第二张图片。您应该仍然可以使用相同的 y 值。
我希望我已经正确理解了你的问题,这就是你要找的。
推荐阅读
- firebase - 如何禁用插件
- java - Apache POI - 缺少单元策略
- google-apps-script - Google App Script - 不使用 UrlFetchApp 发送带有 .xlsx 附件的电子邮件
- twitter-bootstrap - Jade / Pug 模板中带空格的类
- python - 从 OpenCV python 读取图像后提供图像后键入错误
- vue.js - 将 vuetify 从 1.5 升级到 2.1 时出错
- java - java.lang.NullPointerException 在模拟器和手机中停止我的应用程序
- java - 在 Java 中清除和初始化对象 - Android Studio
- mapbox - Mapbox 自动翻译街道名称
- java - java中的ruby块相当于什么