gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 22:48:56 27 4
gpt4 key购买 nike

我正在使用向量来表示图像和标题来执行图像标题任务。

标题向量的长度/维度为 128。图像向量的长度/维度为 2048。

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

编码器:128 -> 2048。

解码器:2048 -> 128。

我关注了this教程来实现一个浅层网络做我想做的事。

但我无法弄清楚如何按照相同的教程创建深度网络。

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)

# this model maps an input to its encoded representation
encoder = Model(input=x_dim_shape, output=encoded)

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

# create the decoder model
decoder = Model(input=encoded_input, output=decoder_layer3(decoder_layer2(decoder_layer1(encoded_input))))

autoencoder.compile(optimizer='adadelta', loss='binary_crossentropy')


autoencoder.fit(training_data_x, training_data_y,
nb_epoch=50,
batch_size=256,
shuffle=True,
validation_data=(test_data_x, test_data_y))

training_data_x 和 test_data_x 有 128 个维度。Training_data_y 和 test_data_y 有 2048 个维度。

我在尝试运行此程序时收到的错误如下:

Exception: Error when checking model target: expected dense_6 to have shape (None, 128) but got array with shape (32360, 2048)

dense_6 是最后一个解码的变量。

最佳答案

自动编码器

如果您愿意可以调用encoderdecoder单独地,您需要做的是完全按照教程训练整个自动编码器,使用 input_shape == output_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_dim < y_dim 。您实际上是在训练一个模型来增加数据维度,这没有多大意义,AFAICT。

你的问题

现在再次阅读您的问题,我认为自动编码器对您想要实现的目标没有任何好处。它们旨在降低数据维度,同时将损失降到最低。

您想要做的是:

  1. 渲染文本到图像(您称之为 encode )
  2. 读取图像中的文本(您称之为 decode )

据我了解,而2.可能确实需要一些机器学习,1.绝对不是:有很多库可以在图像上写入文本。

关于python - Keras 中的深度自动编码器将一个维度转换为另一个维度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39976718/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com