You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 02:12:02