python - 具有可变输入的自动编码器 Keras
问题描述
我有一个实现这样的自动编码器的 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?)以应用您定义的模型。
推荐阅读
- android - Edittext.gettext 不返回 null
- javascript - How to stop using a plugin in vue?
- javascript - Changing vue component in vendor/ in Laravel Nova
- react-native - RNFetchBlob.fs.mkdir executes successfully but doesn't create directory
- asp.net - Wrong dependency to IIS restart for getting changed data in SQL Server
- bash - 尝试使用 bash 从特定字符串 NumberLong("43494254014573") 中提取数字时出现命令未找到错误
- ios - SwiftUI:如何创建具有相同行数和列数的 LazyGrid?
- flutter - 未定义 Flutter 扩展
- javascript - 如何在 JavaScript 的 setInterval 中运行异步函数
- git - Git 添加并提交一个已经被跟踪的目录