在做编程作业的时候遇到了一个很奇怪的
现象:实现模型的准确率(accuracy)总是很低(~34)。
检查:每一步中间结果,初始化,前向,计算loss,计算梯度,更新参数,预测都可以得到预期的输出。
调参:以为是参数没有设置好,尝试调整,learning_rate和迭代次数。
结果:测试的准确率依旧很低。
说明不是后面模型实现的问题。
在论坛里面看了一下,有不少人遇到相同的问题。
原因在图片预处理的reshape步骤出错了。
NG 老师在提示里面已经给出了正确的reshape方法:
A trick when you want to flatten a matrix X of shape (a,b,c,d) to a matrix X_flatten of shape (b ∗ c ∗ d, a) is to use:
X_flatten = X.reshape(X.shape[0], -1).T
我是用的
x_flattern = X.reshape(X.shape[1]*X.shape[2]*X.shape[3], -1)
虽然两种方法得到的ndarray的shape都是(b*c*d, a),但是取数据的次序不一样了,取数据出来的时候就会出错
下面使用简单一点的例子来观察两种reshape得到结果的区别:
a = np.reshape(np.array(range(1, 9)), [2, 2, 2])
a
Out[22]:
array([[[1, 2],
[3, 4]],
[[5, 6],
[7, 8]]])
b = np.reshape(a, [2, -1]).T
c = np.reshape(a, [4, -1])
b
Out[25]:
array([[1, 5],
[2, 6],
[3, 7],
[4, 8]])
c
Out[26]:
array([[1, 2],
[3, 4],
[5, 6],
[7, 8]])
ndarray里面的数字展开成1D数组[1, 2, 3, 4, 5, 6, 7 ,8]
b = np.reshape(a, [2, 4]).T
从最后一维开始组合数字,
[[1, 2, 3, 4],
[5, 6, 7, 8]]
然后是T 转置
[[1, 5],
[2, 6],
[3, 7],
[4, 8]]
[1, 2, 3, 4, 5, 6, 7 ,8]
c = np.reshape(a, [4, 2])
从最后一维开始组合数字,
[[1, 2],
[3, 4],
[5, 6],
[7, 8]]
回到最初的问题:
使用一下方法Reshape:
X_flatten = X.reshape(X.shape[0], -1).T
X_flatten[i] 取出来就是整个数据集中的一张图
而
X_flatten = X.reshape(X.shape[1]* X.shape[2] * X.shape[3], -1)
把图以m=X.shape[0]为步长切分,
然后当使用
X_flatten[i]取出来不是一张正常的图片,而是每张图都取了一部分点组成的奇怪数组,显示出来就是噪声点。因此模型的accuracy一直很低。
Q.E.D