关于完成吴恩达深度学习ResNet50作业遇到的坑

吴恩达的深度学习课程非常棒,从网上下载了学习笔记和作业,跟着笔记学习并完成后面的作业,受益匪浅。这里谈谈我在完成第四课第二周作业《4.2 深度卷积网络模型》中《ResNets》部分所遇到的坑

首先根据作业提示搭建ResNet50的网络模型,这个不复杂,根据提示一步一步做就可以完成了,晚上也有相当多的作业资料可以参考。训练时作业只要求epochs=2,为了提高精度,我设置了epochs=8,模型在训练集上的损失可以降低到0.1以下,准确率77%左右,在测试集上的损失为6.8,准确率17%。

作业最后一步是用自己的图片做测试,我从jupyter notebook中截取了注释中的图片进行预测,但是从0到5所有手势的结果全部是0,第二天再测试,结果又全部变成了4,无论测试多少遍,用原题的图片或者是用自己拍的图片,所有的图片始终只能得到一个结果,怎么会这样?这个问题折腾了2天才最终找到问题原因。以下是我的排查过程

首先,我决定模型本身训练集或测试集上随机选出30张图片丢到模型中,先看看预测结果,训练集能够达到77%的准确率,随机挑选的30张图片预测也应该符合这个规律。一开始我对这些图片也进行了预处理,心想多预处理下数据应该没有坏处。结果令我大跌眼镜,30张图片全部输出0,或者是4,或者是5,全部只有一个结果。用训练集做测试居然都这样,那问题是不是出在predict函数上呢?这个是keras库内置的函数,经过全球的技术人员测试,应该不会有问题呀。那是不是在数据预处理上呢?

抱着试一试的心态,考虑到测试集已经经过了归一化处理,所以我把 x_prec_sub=preprocess_input(img_sub)注释掉了,结果就正确了,模型对不同的图片预测除了不同的结果,虽然有12张错了,但是已经能够看出问题了。

于是我查看了preprocess_input函数的输出结果,发现结果并不全在[0,1]之间,应该是图片白化处理的结果,而训练集的都进行了归一化处理,这就是问题的根源了。

同样,用自己的图片测试,只需要将自己的图片除以255就行了,不能使用源码中preprocess_input函数。

代码如下。

randind=np.random.randint(X_train.shape[0],size=30)      #随机产生训练集集的序号
img_suborig=X_train_orig[randind]                            #随机挑选的测试集图像子集
img_sub=X_train[randind]
print("随机选取的序号为:",randind)
print("本次用于测试train_img_sub.shape:",img_sub.shape)
#x_prec_sub=preprocess_input(img_sub)                         #这里是重点!如果用自己的图片,只需要将图片除以255就行了,不能用这句
out_sub=model.predict(img_sub)
for n in range(30):
    plt.subplot(2,15,n+1)
    plt.title(str(np.argmax(out_sub[n]))+":"+str(np.argmax(Y_train[randind][n])))   #前面是模型预测的结果,后面是正确的结果
    plt.imshow(img_suborig[n])

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值