Python Keras中的深度自动编码器将一个维度转换为另一个维度i

Python Keras中的深度自动编码器将一个维度转换为另一个维度i,python,vector,neural-network,keras,autoencoder,Python,Vector,Neural Network,Keras,Autoencoder,我正在做一个图像字幕任务,使用矢量来表示图像和字幕 标题向量的长度/维度大小为128。 图像向量的长度/尺寸为2048 我想做的是训练一个自动编码器,得到一个能够将文本向量转换成图像向量的编码器。以及能够将图像向量转换为文本向量的解码器 编码器:128->2048 解码器:2048->128 我按照教程来实现一个浅层网络,做我想做的事情 但我不知道如何创建一个深度网络,遵循相同的教程 x_dim=128 y_dim=2048 x尺寸x形状=输入(形状=(x尺寸) 编码=密集(512,激活='re

我正在做一个图像字幕任务,使用矢量来表示图像和字幕

标题向量的长度/维度大小为128。 图像向量的长度/尺寸为2048

我想做的是训练一个自动编码器,得到一个能够将文本向量转换成图像向量的编码器。以及能够将图像向量转换为文本向量的解码器

编码器:128->2048

解码器:2048->128

我按照教程来实现一个浅层网络,做我想做的事情

但我不知道如何创建一个深度网络,遵循相同的教程

x_dim=128
y_dim=2048
x尺寸x形状=输入(形状=(x尺寸)
编码=密集(512,激活='relu')(x_尺寸_形状)
编码=密集(1024,激活='relu')(编码)
编码=密集(y_dim,activation='relu')(编码)
解码=密集(1024,激活='relu')(编码)
解码=密集(512,激活='relu')(解码)
解码=密集(x_dim,激活='sigmoid')(解码)
#此模型将输入映射到其重建
自动编码器=模型(输入=x尺寸形状,输出=解码)
#此模型将输入映射到其编码表示
编码器=模型(输入=x尺寸形状,输出=编码)
编码输入=输入(形状=(y尺寸)
解码器\u layer1=自动编码器。层[-3]
解码器\u layer2=自动编码器。层[-2]
解码器\层3=自动编码器层[-1]
#创建解码器模型
解码器=模型(输入=编码的\输入,输出=解码器\层3(解码器\层2(解码器\层1(编码的\输入)))
编译(优化器='adadelta',loss='binary\u crossentropy')
自动编码器。拟合(训练数据x、训练数据y、,
nb_epoch=50,
批次大小=256,
洗牌=正确,
验证数据=(测试数据x,测试数据y))
训练数据和测试数据有128个维度。 训练数据和测试数据有2048个维度

尝试运行此操作时收到的错误如下:

异常:检查模型目标时出错:预期密集_6具有形状(无,128),但获得具有形状的数组(323602048)

稠密_6是最后一个解码的变量

自动编码器 如果您希望能够分别调用
编码器
解码器
,那么您需要做的是完全按照教程训练整个自动编码器,使用
input\u shape==output\u shape
==128
,在您的情况下),然后才能调用层的子集:

x_dim = 128
y_dim = 2048
x_dim_shape = Input(shape=(x_dim,))
encoded = Dense(512, activation='relu')(x_dim_shape)
encoded = Dense(1024, activation='relu')(encoded)
encoded = Dense(y_dim, activation='relu')(encoded)

decoded = Dense(1024, activation='relu')(encoded)
decoded = Dense(512, activation='relu')(decoded)
decoded = Dense(x_dim, activation='sigmoid')(decoded)

# this model maps an input to its reconstruction
autoencoder = Model(input=x_dim_shape, output=decoded)
autoencoder.compile(optimizer='adadelta', loss='binary_crossentropy')
autoencoder.fit(training_data_x, training_data_x, nb_epoch=50, batch_size=256, shuffle=True, validation_data=(test_data_x, test_data_y))

# test the decoder model
encoded_input = Input(shape=(y_dim,))
decoder_layer1 = autoencoder.layers[-3]
decoder_layer2 = autoencoder.layers[-2]
decoder_layer3 = autoencoder.layers[-1]

decoder = Model(input=encoded_input, output=decoder_layer3(decoder_layer2(decoder_layer1(encoded_input))))
decoder.compile(optimizer='adadelta', loss='binary_crossentropy')
eval = decoder.evaluate(test_data_y, test_data_x)
print('Decoder evaluation: {:.2f}'.format(eval))
请注意,当调用
autoencoder.fit()
时,参数中的
x==y
。这就是自动编码器(通常)必须优化瓶颈表示(您在自己的代码中称之为
y
)的方式,以便以较小的尺寸最佳地匹配原始图像

但是,作为本答案第二部分的过渡,请注意,在您的例子中,
x\u dim
。实际上,您正在训练一个模型来增加数据维度,这没有多大意义,AFAICT

你的问题 现在再次阅读您的问题,我认为自动编码器对您想要实现的目标没有任何好处。它们旨在减少数据的维度,并将伤亡降至最低

您试图做的是:

  • 将文本渲染为图像(您称之为
    encode
  • 读取图像中的文本(您称之为
    解码

  • 据我所知,虽然
    2.
    可能确实需要一些机器学习,但
    1.
    肯定不需要:有很多库可以在图像上编写文本。

    我认为在本教程中起作用的原因是,它们在输入和输出方面对自动编码器进行相同尺寸的训练,而我想训练我的自动编码器从一个维度到另一个维度。