机器学习中自制手写数字预处理:降噪自编码器无输出问题
手写数字去噪自编码器:自定义含噪图像输入无结果的解决方法
我构建了一个去噪自编码器(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输入模型去噪,代码无报错但没有显示去噪图像,求解决方法及具体代码示例。
问题分析与解决代码
问题根源有两个:
- 缺少与训练数据一致的归一化预处理步骤,模型输入数据分布和训练时不匹配;
- 未添加图像显示的代码逻辑,即使模型完成预测也无法输出可视化结果。
修正后的完整代码如下:
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
相关产品推荐
相关产品推荐

