Keras 将完全连接的层堆叠在两个自动编码器上进行分类
我正在使用卷积层对2D图像上的自动编码器进行培训,并希望将完全连接的层放在编码器部分的顶部进行分类。我的自动编码器的定义如下(仅作简单说明): 我的输入图像大小为(64,80,1)。现在,在编码器顶部堆叠完全连接的层时,我将执行以下操作:Keras 将完全连接的层堆叠在两个自动编码器上进行分类,keras,neural-network,deep-learning,autoencoder,keras-2,Keras,Neural Network,Deep Learning,Autoencoder,Keras 2,我正在使用卷积层对2D图像上的自动编码器进行培训,并希望将完全连接的层放在编码器部分的顶部进行分类。我的自动编码器的定义如下(仅作简单说明): 我的输入图像大小为(64,80,1)。现在,在编码器顶部堆叠完全连接的层时,我将执行以下操作: def fc(enco): flat = Flatten()(enco) den = Dense(128, activation='relu')(flat) out = Dense(num_classes, activation='so
def fc(enco):
flat = Flatten()(enco)
den = Dense(128, activation='relu')(flat)
out = Dense(num_classes, activation='softmax')(den)
return out
encode = encoder(input_img)
full_model = Model(input_img,fc(encode))
for l1,l2 in zip(full_model.layers[:19],autoencoder.layers[0:19]):
l1.set_weights(l2.get_weights())
对于只有一个自动编码器,这是可行的,但现在的问题是,我有两个自动编码器对所有大小(64,80,1)的图像集进行训练
对于每个标签,我有两个大小的图像(64、80、1)和一个标签(0或1)作为输入。我需要将图像1送入第一个自动编码器,将图像2送入第二个自动编码器。但是如何在上述代码中组合full\u模型中的两个自动编码器
另一个问题是fit()
方法的输入。到目前为止,只有一个自动编码器,输入仅由图像的numpy数组组成(例如(1000,64,80,1)),但如果有两个自动编码器,我将有两组图像作为输入。如何将其输入到fit()
方法中,以便第一个自动编码器使用第一组图像,第二个自动编码器使用第二组图像?问:如何在全模式中组合这两个自动编码器?
答:您可以在fc
中设置两个自动编码器的瓶颈层enco_1
和enco_2
:
def fc(enco_1, enco_2):
flat_1 = Flatten()(enco_1)
flat_2 = Flatten()(enco_2)
flat = Concatenate()([enco_1, enco_2])
den = Dense(128, activation='relu')(flat)
out = Dense(num_classes, activation='softmax')(den)
return out
encode_1 = encoder_1(input_img_1)
encode_2 = encoder_2(input_img_2)
full_model = Model([input_img_1, input_img_2], fc(encode_1, encode_2))
请注意,手动设置编码器权重的最后一部分是不必要的-请参阅
Q:如何将其输入到fit
方法中,以便第一个自动编码器使用第一组图像,第二个自动编码器使用第二组图像?
答:在上面的代码中,请注意两个编码器的输入不同(每个图像集一个)。现在,如果模型是以这种方式定义的,您可以调用full\u model.fit
,如下所示:
full_model.fit(x=[images_set_1, images_set_2],
y=label,
...)
注意:未测试。谢谢,我会尝试一下。您知道在默认情况下,完整模型中的所有层是否都设置为“可训练”吗?不客气。是的,默认情况下它们都是可训练的。顺便说一句,假设我有两个自动编码器,每个潜在维数为16(即16维向量),也就是说,到完全连接的网络的输入将是32维的。我总共有大约1000个标签和两个类。完全连接的网络有多少层,每层有多少节点?如果我使用多个层,那么节点的数量是否应该从一个层增加到下一个层(例如,两个的倍数)?这很难说,这实际上取决于问题。我将使用验证集调整所有这些超参数好的,谢谢。对于这样一个完全连接的网络,通常的布局是什么?这意味着每层的节点数是增加还是减少(例如,增加或减少两倍),还是在层与层之间保持不变?我认为在使用验证集进行调优时,我需要知道一定范围的参数(例如节点数、层数)。
full_model.fit(x=[images_set_1, images_set_2],
y=label,
...)