R语言MNIST深度网络手写数字识别(第三部分) 自定义图片预测报错求助
R Keras手写数字识别自定义图片预测报错排查
问题背景
使用MNIST数据集训练全连接网络完成手写数字识别的过程完全正常,调用模型预测本地用Windows Paint绘制的手写数字5(文件名为number5.jpg)时触发ValueError。
核心报错原因
你在处理自定义预测图片的步骤存在3处和训练数据预处理逻辑不一致的问题,是报错的根本原因:
- 输入维度不匹配:MNIST训练用的是单通道灰度图,单张输入展平后是784维(2828),你读取的JPG是3通道RGB图,resize后维度是2828*3,强行截取前784维的操作无效,输入维度和模型输入层要求的
input_shape = c(784)不匹配 - 色彩空间不匹配:MNIST数据集是黑底白字,你用Paint绘制的是白底黑字,直接输入会导致特征完全匹配不上
- 没有做归一化对齐:训练时你将训练/测试数据都除以255做了归一化,自定义预测图片没有做相同的预处理操作
修复后的自定义图片处理代码
library(EBImage) setwd("C:/Users/hofo/Arbeidsmapper/Documents/NLP/NLP_BOSTOTTE/JPG_filer") # 读取图片并转为单通道灰度图 mypic <- readImage("number5.jpg") mypic <- channel(mypic, "gray") # 缩放到28*28尺寸 mypic <- resize(mypic, 28, 28) # 颜色反转:白底黑字转黑底白字,和MNIST特征对齐 mypic <- 1 - mypic # 展平为784维,EBImage读取的灰度图默认范围是0-1,和训练时的归一化逻辑一致,无需额外除以255 newx <- array_reshape(mypic, c(1, 784)) # 预测,原有代码末尾的.[1:9]为冗余逻辑,单张图片仅返回1个预测结果 pred <- model %>% predict(newx) %>% k_argmax() %>% as.integer() print(pred)
冗余代码说明
你原有代码里的array_reshape(mypic, c(28, 28, 3))、new <- NULL、new <- rbind(new, mypic)、newx <- new[1:1,1:784]均为错误的冗余操作,直接删除即可。
内容的提问来源于stack exchange,提问作者Farshid Owrang
相关产品推荐
相关产品推荐

