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

机器学习中自制手写数字预处理:降噪自编码器无输出问题

手写数字去噪自编码器:自定义含噪图像输入无结果的解决方法

我构建了一个去噪自编码器(Denoising Autoencoder)用于去除含噪手写数字的噪声,但将自制的含噪手写数字图像输入模型时,代码无报错却无法显示去噪后的图像。

以下是训练去噪自编码器的代码:

from keras.datasets import mnist
import numpy as np
import matplotlib.pyplot as plt
import keras
from keras import layers
from keras.callbacks import TensorBoard

(x_train, _), (x_test, _) = mnist.load_data()

x_train = x_train.astype('float32') / 255.
x_test = x_test.astype('float32') / 255.
x_train = np.reshape(x_train, (len(x_train), 28, 28, 1))
x_test = np.reshape(x_test, (len(x_test), 28, 28, 1))

noise_factor = 0.5
x_train_noisy = x_train + noise_factor * np.random.normal(loc=0.0, scale=1.0, size=x_train.shape) 
x_test_noisy = x_test + noise_factor * np.random.normal(loc=0.0, scale=1.0, size=x_test.shape) 

x_train_noisy = np.clip(x_train_noisy, 0., 1.)
x_test_noisy = np.clip(x_test_noisy, 0., 1.)

input_img = keras.Input(shape=(28, 28, 1))

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)

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(1, (3, 3), activation='sigmoid', padding='same')(x)

autoencoder = keras.Model(input_img, decoded)
autoencoder.compile(optimizer='adam', loss='binary_crossentropy')

autoencoder.fit(x_train_noisy, x_train,
                epochs=25,
                batch_size=128,
                shuffle=True,
                validation_data=(x_test_noisy, x_test),
                callbacks=[TensorBoard(log_dir='/tmp/tb', histogram_freq=0, write_graph=False)])
autoencoder.save("model_number.h5")

之后我尝试将自制的含噪手写数字图像noise_number1.png输入模型去噪,代码无报错但没有显示去噪图像,求解决方法及具体代码示例。


问题分析与解决代码

问题根源有两个:

  1. 缺少与训练数据一致的归一化预处理步骤,模型输入数据分布和训练时不匹配;
  2. 未添加图像显示的代码逻辑,即使模型完成预测也无法输出可视化结果。

修正后的完整代码如下:

from PIL import Image
from keras.models import load_model
import numpy as np
import matplotlib.pyplot as plt

# 加载并预处理自定义含噪图像
img = Image.open('/content/noise_number1.png').convert('L')  # 转为灰度图
img = img.resize((28,28))  # 调整为模型输入尺寸28x28
img = np.array(img) 
img = img.reshape(28,28,1)  # 增加通道维度,匹配模型输入shape
img = img.astype('float32') / 255.  # 归一化,与训练数据预处理一致

# 加载训练好的模型并预测
autoencoder = load_model("model_number.h5")
pred = autoencoder.predict(img[np.newaxis], verbose=0)  # 增加batch维度

# 可视化含噪图像与去噪结果
plt.figure(figsize=(8,4))
plt.subplot(1,2,1)
plt.imshow(img.squeeze(), cmap='gray')
plt.title('含噪手写数字')
plt.axis('off')

plt.subplot(1,2,2)
plt.imshow(pred.squeeze(), cmap='gray')
plt.title('去噪后手写数字')
plt.axis('off')

plt.show()

内容的提问来源于stack exchange,提问作者rgh6

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 17:35:12