问题描述
我正在训练CNN来比较两个图像。然后,CNN可以说出我放入CNN中的新图像是否相等。因此,我通过cv2连接了这些图像,以便获得形状为(330,530,6)(以rgb为单位)的图像,或者像我将其以灰度级进行绘制(330,2)一样。 这对我来说很好用,但是如果我将两个模型弄平后将它们串联起来,我想知道CNN的工作原理。我正在使用keras顺序模型。有没有办法在不更改所有内容的情况下连接这两个模型?因为我以fit方法提供数据,所以我不确定如何将这两个数据都交给每个模型。
这是我使用的型号:
CNN = Sequential()
CNN.add(layers.Conv2D(32,(3,3),activation='relu',kernel_regularizer=regularizers.l2(l2Reg),input_shape=(330,2)))
CNN.add(layers.MaxPool2D(pool_size=(2,2)))
CNN.add(layers.Conv2D(32,kernel_regularizer=regularizers.l2(l2Reg)))
CNN.add(layers.MaxPool2D(pool_size=(3,3)))
CNN.add(layers.Conv2D(64,3)))
CNN.add(layers.Flatten())
CNN.add(layers.Dropout(0.5))
CNN.add(layers.Dense(128,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")
解决方法
您可以创建一个包含两个项目的输入列表,例如'image1'和'image2'。然后,您可以为每个以 Flatten 层结尾的图像创建卷积层和池化层的分支。
使用330x530灰度图像的示例:
Observable
要将数据输入该模型,您将需要一个字典作为X值。 export interface UserRoles {
admin: boolean;
editor: boolean;
subscriber: boolean;
}
@Injectable({
providedIn: 'root'
})
export class IsAdminGuard implements CanActivate {
constructor(private auth: AngularFireAuth,private afs: AngularFirestore) {}
canActivate(): Observable<boolean> {
return this.auth.user.pipe(
switchMap((user) => !user?.uid
? of(false)
: this.afs.doc<UserRoles>(`roles/${user.uid}`).valueChanges().pipe(
map((roles) => !!(roles?.admin))
)
),take(1)
);
}
}
应该包含所有第一张图像,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,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)
应该包含所有第二张图像。您仍然应该能够使用相同的y值。
我希望我已经正确理解了您的问题,这就是您要寻找的。 p>