Keras 中的深度自动编码器将一维转换为另一维
Deep autoencoder in Keras converting one dimension to another i
我正在使用表示图像和说明的矢量来完成图像说明任务。
标题向量的 legth/dimension 大小为 128。
图像向量的 length/dimension 大小为 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是最后解码的变量。
自动编码器
如果你想要能够分别调用 encoder
和 decoder
,你需要做的就是完全按照教程训练整个自动编码器,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。
你的问题
现在再次阅读你的问题,我认为自动编码器对你想要实现的目标没有任何好处。它们旨在 减少 数据的维度,将人员伤亡降至最低。
您要做的是:
- 将文本渲染 为图像(您所说的
encode
)
- 从图片中读取一段文字(所谓的
decode
)
据我了解,虽然 2.
可能确实需要一些机器学习,但 1.
绝对不需要:有很多库可以在图像上写入文本。
我正在使用表示图像和说明的矢量来完成图像说明任务。
标题向量的 legth/dimension 大小为 128。 图像向量的 length/dimension 大小为 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是最后解码的变量。
自动编码器
如果你想要能够分别调用 encoder
和 decoder
,你需要做的就是完全按照教程训练整个自动编码器,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。
你的问题
现在再次阅读你的问题,我认为自动编码器对你想要实现的目标没有任何好处。它们旨在 减少 数据的维度,将人员伤亡降至最低。
您要做的是:
- 将文本渲染 为图像(您所说的
encode
) - 从图片中读取一段文字(所谓的
decode
)
据我了解,虽然 2.
可能确实需要一些机器学习,但 1.
绝对不需要:有很多库可以在图像上写入文本。