我正在构建一个神经网络,我必须将我的训练数据集扁平化。
我有两个选择。1是:
train_x_flatten = train_x_orig.reshape(train_x_orig.shape[0], -1).T
第二种是:
train_x_flatten = train_x_orig.reshape(train_x_orig.shape[1]*train_x_orig.shape[2]*train_x_orig.shape[3], 209)
两个都是一样的形状,但是我在计算成本的时候发现了区别,为什么呢,谢谢你。
根据第二个例子,你的原始张量至少是4级。 第一个例子拉出每个元素,按增加最右边的索引排序,并将元素插入到长度为第零个形状的行中。 然后进行转置。
第二个例子又从最右边的索引递增的方式拉出元素,即。
element = train_x_orig[0, 0, 0, 0]
new_row.append(element)
element = train_x_orig[0, 0, 0, 1]
new_row.append(element)
但行的大小不同。 现在是张量中其他一切元素的尺寸。
下面是一个例子来说明。
首先我们创建一个有序数组,并将其重塑为4级。
import numpy as np
x = np.arange(36).reshape(3,2,3,2)
x
# returns:
array([[[[ 0, 1],
[ 2, 3],
[ 4, 5]],
[[ 6, 7],
[ 8, 9],
[10, 11]]],
[[[12, 13],
[14, 15],
[16, 17]],
[[18, 19],
[20, 21],
[22, 23]]],
[[[24, 25],
[26, 27],
[28, 29]],
[[30, 31],
[32, 33],
[34, 35]]]])
下面是第一个例子的输出
x.reshape(x.shape[0], -1).T
# returns:
array([[ 0, 12, 24],
[ 1, 13, 25],
[ 2, 14, 26],
[ 3, 15, 27],
[ 4, 16, 28],
[ 5, 17, 29],
[ 6, 18, 30],
[ 7, 19, 31],
[ 8, 20, 32],
[ 9, 21, 33],
[10, 22, 34],
[11, 23, 35]])
这里是第二个例子
x.reshape(x.shape[1]*x.shape[2]*x.shape[3], -1)
# returns:
array([[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8],
[ 9, 10, 11],
[12, 13, 14],
[15, 16, 17],
[18, 19, 20],
[21, 22, 23],
[24, 25, 26],
[27, 28, 29],
[30, 31, 32],
[33, 34, 35]])
元素如何重新排序是根本不同的。