Keras卷积自编码器实现三通道128*128图像重建出现负损失求助
问题原因与解决方法
核心错误
你在解码器部分错误使用了UpSampling3D层:
UpSampling3D是为3D卷积任务(如视频帧序列、3D体素数据)设计的,要求输入维度为(batch_size, 空间维度1, 空间维度2, 空间维度3, 通道数)- 你的编码器输出是2D特征图,维度为
(batch_size, 32, 32, 32),用UpSampling3D会导致张量维度计算完全错乱,最终输出形状和输入不匹配,损失计算时触发异常广播,出现负损失的问题。
其他注意事项
使用sigmoid输出层+binary_crossentropy损失的组合,要求输入的训练/测试数据必须归一化到[0,1]区间,若你的数据还是0~255的原始像素值,也会导致损失计算异常。如果不想做归一化,可以将损失函数替换为mse。
修复后代码
import keras from keras import layers input_dim = (128, 128, 3) input_img = keras.Input(shape=input_dim) # 编码器 x = layers.Conv2D(32, (3, 3), activation='relu', padding='same')(input_img) x = layers.MaxPooling2D((2, 2), padding='same')(x) x = layers.Conv2D(32, (3, 3), activation='relu', padding='same')(x) encoded = layers.MaxPooling2D((2, 2), padding='same')(x) # 解码器 替换UpSampling3D为UpSampling2D x = layers.Conv2D(32, (3, 3), activation='relu', padding='same')(encoded) x = layers.UpSampling2D((2, 2))(x) x = layers.Conv2D(32, (3, 3), activation='relu', padding='same')(x) x = layers.UpSampling2D((2, 2))(x) decoded = layers.Conv2D(3, (3, 3), activation='sigmoid', padding='same')(x) autoencoder = keras.Model(input_img, decoded) autoencoder.compile(optimizer='adam', loss='binary_crossentropy') # 数据归一化,使用binary_crossentropy必须执行这一步 x_train = x_train.astype('float32') / 255. x_test = x_test.astype('float32') / 255. autoencoder.fit(x_train, x_train, epochs=50, batch_size=128, shuffle=True, validation_data=(x_test, x_test))
验证步骤
训练前可以执行print(autoencoder.summary())查看各层输出形状,确认解码器最终输出维度为(None, 128, 128, 3),和输入形状完全匹配后再启动训练即可。
内容的提问来源于stack exchange,提问作者Borja_042
相关产品推荐
相关产品推荐

