Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Keras 将完全连接的层堆叠在两个自动编码器上进行分类_Keras_Neural Network_Deep Learning_Autoencoder_Keras 2 - Fatal编程技术网

Keras 将完全连接的层堆叠在两个自动编码器上进行分类

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

我正在使用卷积层对2D图像上的自动编码器进行培训,并希望将完全连接的层放在编码器部分的顶部进行分类。我的自动编码器的定义如下(仅作简单说明):

我的输入图像大小为(64,80,1)。现在,在编码器顶部堆叠完全连接的层时,我将执行以下操作:

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,
               ...)