自编码器形状问题
我在使用自编码器的时候遇到了一个问题,输出的形状设置得不对。目前自编码器的代码是这样的。
我遇到了这个错误:
ValueError: 维度必须相等,但'{{node mean_absolute_error/sub}} = Sub[T=DT_FLOAT](sequential_8/sequential_7/conv1d_transpose_14/BiasAdd, IteratorGetNext:1)'的输入形状是:[?,2000,3]和[?,3750,3],它们的维度分别是2000和3750。
有没有人能帮我调整一下架构,如果可以的话。我好像忘记了最初为了调整这个问题所做的修改。
import tensorflow as tf
from tensorflow.keras.models import Model
from tensorflow.keras.layers import Input, Conv1D, MaxPooling1D, UpSampling1D, concatenate
from tensorflow.keras.callbacks import EarlyStopping
# Provided encoder
encoder = tf.keras.models.Sequential([
tf.keras.layers.Reshape([3750, 3], input_shape=[3750, 3]),
tf.keras.layers.Conv1D(32, kernel_size=5, padding="same", activation="relu"),
tf.keras.layers.MaxPool1D(pool_size=2),
tf.keras.layers.Conv1D(64, kernel_size=5, padding="same", activation="relu"),
tf.keras.layers.MaxPool1D(pool_size=2),
tf.keras.layers.Conv1D(128, kernel_size=5, padding="same", activation="relu"),
tf.keras.layers.MaxPool1D(pool_size=2),
tf.keras.layers.Conv1D(256, kernel_size=5, padding="same", activation="relu"),
tf.keras.layers.MaxPool1D(pool_size=2),
tf.keras.layers.Conv1D(512, kernel_size=5, padding="same", activation="relu"),
tf.keras.layers.MaxPool1D(pool_size=2),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(512)
])
#latent space
decoder = tf.keras.models.Sequential([
tf.keras.layers.Dense(512 * 125, input_shape=[512]),
tf.keras.layers.Reshape([125, 512]),
tf.keras.layers.Conv1DTranspose(512, kernel_size=5, strides=1, padding="same", activation="relu"),
tf.keras.layers.UpSampling1D(size=2),
tf.keras.layers.Conv1DTranspose(256, kernel_size=5, strides=1, padding="same", activation="relu"),
tf.keras.layers.UpSampling1D(size=2),
tf.keras.layers.Conv1DTranspose(128, kernel_size=5, strides=1, padding="same", activation="relu"),
tf.keras.layers.UpSampling1D(size=2),
tf.keras.layers.Conv1DTranspose(64, kernel_size=5, strides=1, padding="same", activation="relu"),
tf.keras.layers.UpSampling1D(size=2),
# Adjust the kernel size and padding to match the input shape
tf.keras.layers.Conv1DTranspose(3, kernel_size=5, strides=1, padding="same", activation="linear")
])
# Add more layers with larger kernel sizes to both encoder and decoder.
ae = tf.keras.models.Sequential([encoder, decoder])
ae.compile(
loss="mean_squared_error",
optimizer=tf.keras.optimizers.Adam(learning_rate=0.00001)
)
# Define the early stopping criteria
early_stopping = EarlyStopping(monitor='val_loss', patience=30, mode='min')
history = ae.fit(X_train, X_train, batch_size=8, epochs=150, validation_data=(X_val, X_val), callbacks=[early_stopping]) ```
1 个回答
0
这个错误提示说明你的自编码器在处理输入和输出图像时,出现了维度不匹配的问题,这导致在计算均方误差时出错。你可以通过使用 model.summary() 来查看模型的输出形状,结果会显示如下:
一个简单的解决办法是添加填充层,比如你可以使用以下的解码器架构:
decoder = tf.keras.models.Sequential([
tf.keras.layers.Dense(512 * 125, input_shape=[512]),
tf.keras.layers.Reshape([125, 512]),
tf.keras.layers.Conv1DTranspose(512, kernel_size=5, strides=1, padding="same", activation="relu"),
tf.keras.layers.UpSampling1D(size=2),
tf.keras.layers.Conv1DTranspose(256, kernel_size=5, strides=1, padding="same", activation="relu"),
tf.keras.layers.UpSampling1D(size=2),
tf.keras.layers.Conv1DTranspose(128, kernel_size=5, strides=1, padding="same", activation="relu"),
tf.keras.layers.UpSampling1D(size=2),
tf.keras.layers.Conv1DTranspose(64, kernel_size=5, strides=1, padding="same", activation="relu"),
tf.keras.layers.UpSampling1D(size=2),
tf.keras.layers.ZeroPadding1D(padding=875),
# Adjust the kernel size and padding to match the input shape
tf.keras.layers.Conv1DTranspose(3, kernel_size=5, strides=1, padding="same", activation="linear")
])
注意:最好把这些嵌入层放在其他层之间,这样可以避免在某一层中堆积太多的零,导致模型变得复杂。