【问题标题】:Autoeconders Keras with Variable Inputs具有可变输入的自动编码器 Keras
【发布时间】:2019-10-13 10:14:58
【问题描述】:

我有一个实现这样的自动编码器的 keras 代码:

ENCODING_DIM = 5

# input placeholder
input_img = tf.keras.layers.Input(shape=(320,))

# this is the encoded representation of the input
encoded = tf.keras.layers.Dense(35, activation='relu')(input_img)
encoded = tf.keras.layers.Dense(20, activation='relu')(encoded)
encoded = tf.keras.layers.Dense(ENCODING_DIM, activation='relu')(encoded)

decoded = tf.keras.layers.Dense(20, activation='relu')(encoded)
decoded = tf.keras.layers.Dense(35, activation='relu')(decoded)
decoded = tf.keras.layers.Dense(320, activation='sigmoid')(decoded)

autoencoder = tf.keras.models.Model(input_img, decoded)

encoder = tf.keras.models.Model(input_img, encoded)
encoded_input = tf.keras.layers.Input(shape=(ENCODING_DIM,))

decoder_layer = autoencoder.layers[-1]
#decoded_input = tf.keras.models.Model(encoded_input,decoder_layer(encoded_input))

autoencoder.compile(optimizer='nadam', loss='binary_crossentropy')
from keras.callbacks import ModelCheckpoint

效果很好。

现在我想要可变的输入尺寸(例如,第一个向量 [320x1]、第二个 [280x1] 等...)

现在我尝试这样做:

ENCODING_DIM = 5

# input placeholder
input_img = tf.keras.layers.Input(shape=(None,))

# this is the encoded representation of the input
encoded = tf.keras.layers.Dense(35, activation='relu')(input_img)
encoded = tf.keras.layers.Dense(20, activation='relu')(encoded)
encoded = tf.keras.layers.Dense(ENCODING_DIM, activation='relu')(encoded)

decoded = tf.keras.layers.Dense(20, activation='relu')(encoded)
decoded = tf.keras.layers.Dense(35, activation='relu')(decoded)
decoded = tf.keras.layers.Dense(320, activation='sigmoid')(decoded)

autoencoder = tf.keras.models.Model(input_img, decoded)

encoder = tf.keras.models.Model(input_img, encoded)
encoded_input = tf.keras.layers.Input(shape=(ENCODING_DIM,))

decoder_layer = autoencoder.layers[-1]
#decoded_input = tf.keras.models.Model(encoded_input,decoder_layer(encoded_input))

autoencoder.compile(optimizer='nadam', loss='binary_crossentropy')
from keras.callbacks import ModelCheckpoint

但它返回如下错误:

ValueError                                Traceback (most recent call last)
<ipython-input-24-7764c4707491> in <module>()
     14 
     15 # this is the encoded representation of the input
---> 16 encoded = tf.keras.layers.Dense(35, activation='relu')(input_img)
     17 encoded = tf.keras.layers.Dense(20, activation='relu')(encoded)
     18 encoded = tf.keras.layers.Dense(ENCODING_DIM, activation='relu')(encoded)

2 frames
/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/layers/core.py in build(self, input_shape)
    935     input_shape = tensor_shape.TensorShape(input_shape)
    936     if tensor_shape.dimension_value(input_shape[-1]) is None:
--> 937       raise ValueError('The last dimension of the inputs to `Dense` '
    938                        'should be defined. Found `None`.')
    939     last_dim = tensor_shape.dimension_value(input_shape[-1])

ValueError: The last dimension of the inputs to `Dense` should be defined. Found `None`.

如何实现具有不同输入维度的自动编码器?

【问题讨论】:

  • 在您的情况下,密集层将创建 35 个神经元,每个神经元将连接到每个输入特征(共 320 个)。例如,它将初始化大小为 35x320 的权重矩阵。当输入大小未知时,至少在涉及密集层时,无法初始化这样的矩阵。您必须将输入填充到某个最大可能的输入长度(320?)以应用您定义的模型。
  • 谢谢。 pad 解决方案似乎是解决可变输入尺寸的唯一方法
  • @y.selivonchyk 我支持您的回答并建议将其从评论移至回答

标签: python tensorflow keras autoencoder


【解决方案1】:

在您的情况下,密集层将创建 35 个神经元,每个神经元将连接到每个输入特征(共 320 个)。例如,它将初始化大小为 35x320 的权重矩阵。当输入大小未知时,至少在涉及密集层时,无法初始化这样的矩阵。您必须将输入填充到某个最大可能的输入长度(320?)以应用您定义的模型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-10
    • 2020-01-29
    • 2019-10-19
    • 2017-11-27
    • 2017-07-19
    • 2018-09-13
    相关资源
    最近更新 更多