Автоэкондеры Keras с переменным входом - PullRequest
1 голос
/ 28 мая 2019

У меня есть код 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`.

Как я могу реализовать автоэнкодер с разными входными размерами?

1 Ответ

0 голосов
/ 28 мая 2019

Плотный слой создаст, в вашем случае, 35 нейронов, каждый из которых будет подключен к каждой входной функции (из 320). Это будет инициализировать матрицу весом размером 35x320, например. Невозможно инициализировать такую ​​матрицу, когда входной размер неизвестен, по крайней мере, когда речь идет о плотных слоях. Вы должны будете дополнить свои входные данные до некоторой максимально возможной входной длины (320?), Чтобы применить модель, как вы ее определяете.

...