-1就是矩阵转换后根本不清楚最终要被转换成多少行,但是知道其他的信息。这是手写数字识别中初始化的经典代码,这两天也在研究这个,下面写上我自己的一点理解。
importnumpy
X_train=numpy.array([
[[ 1.,0.,0.,8],
[ 0.,1.,0,90],
[ 0.,0.,1,77]],
[[ 1.,0.,0,65],
[ 0.,1.,0,-8],
[ 0.,0.,1,20]]
])
print(X_train)
输出肯定是(2,3,4)可以简单理解为2个3 X 4的矩阵,那么若是4维矩阵呢?
X_train=numpy.array([
[[ 1., 0., 0.,8],
[ 0., 1., 0,90],
[ 0., 0., 1,77]],
[[ 1., 0., 0,65],
[ 0., 1., 0,-8],
[ 0., 0., 1,20]]
])
X_train = X_train.reshape(-1,X_train.shape[1],X_train.shape[2],1)
print(X_train)
print(X_train.shape)
我们知道X_train.shape[1]=3,X_train.shape[2]=4,所以X_train.reshape(-1,3,4,1),就是先按照4行1列构造出4 X 1的矩阵,将这个矩阵称之为A矩阵,我们可以将A矩阵看成是a列的单列矩阵,然后再与前面的3结合,表示3行a列的矩阵,构造出B矩阵,可以将B矩阵看成是b列的单列矩阵,-1表示未知数,则合起来就是未知行b列的矩阵,由于原矩阵是2 X 3 X 4,矩阵元素的数目是确定的,新的矩阵列数已知,就可以算出矩阵的行了,然后生成最终的矩阵。变换后的矩阵如下:
[[[[ 1.]
[ 0.]
[ 0.]
[ 8.]]
[[ 0.]
[ 1.]
[ 0.]
[90.]]
[[ 0.]
[ 0.]
[ 1.]
[77.]]]
[[[ 1.]
[ 0.]
[ 0.]
[65.]]
[[ 0.]
[ 1.]
[ 0.]
[-8.]]
[[ 0.]
[ 0.]
[ 1.]
[20.]]]]
构造的原则是从右往左两个数字一组顺序看,两个数左边的表示行,右边的表示列,递归构造出矩阵。