本系列会记录萌新博主学习吴恩达深度学习课程中踩过的各种坑,希望对和我一样的萌新起到借鉴的作用,有错误或不完善的地方还请大佬指正。
1. 注意reshape的使用
reshape操作是按一定顺序的,default情况下使用C模式,即最后一个维度变化最快。所以直接reshape和reshape再转置得到的结果是不一样的,但如果一个np.array只有一个维度不为1,其他维度都为1,这时两种情况的结果相同。
train_set_x_flatten_1 = train_set_x_orig.reshape(-1, train_set_x_orig.shape[0])
train_set_x_flatten_2 = train_set_x_orig.reshape(train_set_x_orig.shape[0], -1).T
train_set_x_flatten_1 != train_set_x_flatten_2
------------------------------------------------------------------------------------------
train_set_x_flatten_1 = train_set_x_orig.reshape(-1, 1)
train_set_x_flatten_2 = train_set_x_orig.reshape(1, -1).T
train_set_x_flatten_1 == train_set_x_flatten_2
2. 一些被废弃的函数
scipy库中很多旧版本的函数已经无法使用了,可以使用相同功能的其他函数代替,网上资料很多。
3. 课程提供的代码基于jupyter notebook, 如果使用其他IDE的话,查看图像时需要加上plt.show()命令,注意plt.show()后面的程序需要关掉图片才能继续运行。
4. 把迭代次数设置低一些可以减轻过拟合,比如将迭代次数设置为900后,train set accuracy适当降低,test set accuracy有所提高。
5. 注意输入图像的格式
在我进行最后一步,即识别自己的图片时, 出现下图所示报错:
这是因为输入的图片为png格式,或由png格式转的jpg格式。
jpg一共有RGB三个通道,而png有RGBA(最后一个通道表示透明度)四个通道,因此按原来的代码运行会出错。
只需使用.convert("RGB")进行转化,非常方便。(由于提供的函数aborted了用不了我这里的读取方式已经改成了Image.open)
image_raw = Image.open(fname).convert("RGB")
image = np.array(image_raw)
6. 输入数据的标准化
作业中提到了对输入图像进行标准化,标准化可概括为:减均值,再除以标准差。标准化可以加快训练时的收敛速度, 以及使输入的各个维度“影响”相近,并消除量纲的影响。输入为图像时一种比较方便简便的做法是把矩阵除以255,作业里使用的就是这种方法。
可能会有人比较好奇,如果不除以255会怎么样,试验的时候要记得,下面的这种sigmoid函数写法会报错,当x比较大时会溢出(我也不懂什么原理。。)。
s = 1 / (1 + np.exp(-x))
要想跑通的话可以换成:
s = .5 * (1 + np.tanh(.5 * x))