从2个自动编码器中提取特征,并将它们输入到MLP中

2024-04-25 18:56:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我知道从自动编码器中提取的特征可以输入到mlp中用于分类或回归。这是我早些时候做的。
但是如果我有两个自动编码器呢?我能从2个自动编码器的瓶颈层提取特征并将它们输入到基于这些特征的分类的mlp中吗?如果是,那怎么办?我不知道如何连接这两个功能集。我试过了numpy.hs标签()这给了我“不可损坏的切片”错误,但是,使用特氟康卡特()给出了一个错误“模型的输入张量必须是Keras张量”。两个自动编码器的瓶颈层都是维度(None,100)。所以,本质上,如果我水平地堆叠它们,我应该得到一个(无,200)。mlp的隐藏层可能包含一些(num_hidden=100)神经元。谁能帮忙吗?在

x1 = autoencoder1.get_layer('encoder2').output
x2 = autoencoder2.get_layer('encoder2').output

#inp = np.hstack((x1, x2))
inp = tf.concat([x1, x2], 1)
x = tf.concat([x1, x2], 1)
h = Dense(num_hidden, activation='relu', name='hidden')(x)
y = Dense(1, activation='sigmoid', name='prediction')(h)
mymlp = Model(inputs=inp, outputs=y)

# Compile model
mymlp.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

# Train model
mymlp.fit(x_train, y_train, epochs=20, batch_size=8)

根据@twolffpiggott的建议更新:

^{pr2}$

给我一个错误:行中的unshable type:“list”: myMLP=模型(inputs=[autoencoder1.inputs,autoencoder2.inputs],outputs=y)


Tags: 模型错误分类特征编码器numhiddeninputs
2条回答

我也会采用Daniel的第一种方法(为了简单和高效),但是如果您对第二种方法感兴趣;例如,如果您对端到端的网络运行感兴趣,您可以这样做:

# make autoencoders not trainable
autoencoder1.trainable = False
autoencoder2.trainable = False

encoded1 = autoencoder1(kerasInputs1)
encoded2 = autoencoder2(kerasInputs2)

concatenated = layers.concatenate([encoded1, encoded2], axis=-1)
h = Dense(num_hidden, activation='relu', name='hidden')(concatenated)
y = Dense(1, activation='sigmoid', name='prediction')(h)

myMLP = Model([input_data1, input_data2], y)

myMLP.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

# Training
myMLP.fit([x1_train, x2_train], y_train, epochs=200, batch_size=8)

# Testing
myMLP.predict([x1_test, x2_test])

编辑

  1. 否则,两个编码器的梯度学习阶段的初始权值都会被随机初始化。在
  2. 自动编码器输入层应该分配给每个自动编码器的独立变量input_data1和{}(而不是两者都分配给input_data)。即使autoencoder1.inputs返回一个tf张量,这也是unhashable type: list异常的来源,用[input_data1, input_data2]替换可以解决这个问题。在
  3. 当为端到端模型拟合MLP时,输入应该是x1_train和{}的列表,而不是串联的输入。预测时也一样。在

问题是你把numpy数组和keras张量混合在一起。这不能走。在

有两种方法。在

  • 从每个自动编码器预测numpy数组,将数组合并,发送到第三个模型
  • 连接所有型号,可能使自动编码器无法训练,适合每个自动编码器的一个输入。在

就我个人而言,我会选择第一个。(假设自动编码器已经过训练,不需要更改)。在

第一种方法

numpyOutputFromAuto1 = autoencoder1.predict(numpyInputs1)    
numpyOutputFromAuto2 = autoencoder2.predict(numpyInputs2)

inputDataForThird = np.concatenate([numpyOutputFromAuto1,numpyOutputFromAuto2],axis=-1)

inputTensorForMlp = Input(inputsForThird.shape[1:])
h = Dense(num_hidden, activation='relu', name='hidden')(inputTensorForMlp)
y = Dense(1, activation='sigmoid', name='prediction')(h)

mymlp = Model(inputs=inputTensorForMlp, outputs=y)

....
mymlp.fit(inputDataForThird ,someY)

第二种方法

这有点复杂,一开始我觉得没什么理由这么做。(当然,在某些情况下,这是个不错的选择)

现在我们完全忘记了numpy和keras张量。在

自行创建mlp(如果以后不使用自动编码器,则很好):

^{pr2}$

我们可能想要自动编码器的瓶颈特性,对吧?如果您碰巧创建了正确的自动编码器:编码器模型,解码器模型,连接两者,那么只使用编码器模型就更容易了。其他:

encodedOutput1 = autoencoder1.layers[bottleneckLayer].outputs #or encoder1.outputs
encodedOutput2 = autoencoder1.layers[bottleneckLayer].outputs #or encoder2.outputs

创建关联模型。我们必须使用kera作为连接层:

^{4}$

相关问题 更多 >