首页 文章

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

提问于
浏览
1

我正在使用向量来表示图像和 Headers ,从而进行图像 Headers 任务 .

字幕向量具有大小为128的legth / 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个维度 .

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

异常:检查模型目标时出错:期望dense_6具有形状(无,128)但是具有形状的数组(32360,2048)

dense_6是最后一个解码变量 .

1 回答

  • 3

    自动编码器

    如果你想要能够分别调用 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 .

    你的问题

    现在再次阅读您的问题,我不认为自动编码器对您想要实现的目标有任何好处 . 它们旨在实现数据的维度,并且伤亡最小 .

    你要做的是:

    • Render 文字到图像(你叫什么 encode

    • Read 图像中的文字(你叫什么 decode

    在我的理解中,虽然 2. 可能确实需要一些机器学习,但是 1. 肯定不会:有很多库在图像上写文字 .

相关问题