python - PyTorch - 不同形状的 numpy 数组的基本数学运算
问题描述
1:我有两个不同形状的 numpy 数组,我打算从结果操作中得到均方误差。numpy 数组具有不同的形状,作为训练的一部分,我有一个与预测 numpy 数组分开的验证集,但预测集是从 numpy 数组构建的。
2:我尝试使用 torch.Tensor.repeat() 作为扩大预测集的一种方式,但我缺乏正确的数学来有效地重复。
3:训练方法:
def train(net, x_train, x_opt, BATCH_SIZE, EPOCHS, input_dim):
outputs = 0
mse = 0
optimizer = optim.SGD(net.parameters(), lr=0.001)
loss_function = nn.MSELoss()
loss = 0
for epoch in range(EPOCHS):
for i in tqdm(range(0, len(x_train), BATCH_SIZE)):
batch_y = x_opt[i:i + BATCH_SIZE]
net.zero_grad()
outputs = net(batch_y)
loss = loss_function(outputs, batch_y)
loss.backward()
optimizer.step() # Does the update
print(f"Epoch: {epoch}. Loss: {loss}")
outputs = torch.Tensor.repeat(outputs, *****....***?, 1)
return np.mean(np.power(x_opt - outputs.data.numpy(), 2), axis=1)
4:错误:ValueError:操作数无法与形状一起广播(92334,10)(46,10)
解决方案
如果将较大的填充到可被较小形状整除的形状,则可以在两者之间进行广播。
def pad_to_divisible_shape(arr, a_r, b_r):
div = int(np.ceil(a_r/b_r))
p = div*b_r-a_r
return np.pad(arr, ((0,p),(0,0))), div
def broadcast_op(a, b):
"""Where a and b are numpy arrays and a.shape[0]>b.shape[0]"""
a_r, b_r = a.shape[0], b.shape[0]
a, div = pad_to_divisible_shape(a, a_r, b_r)
a, b = a.reshape(div, b_r, -1), b.reshape(1, b_r, -1)
return ((((a-b).reshape(-1, a.shape[-1]))**2).mean(axis=1))[:a_r]
a = np.random.randn(92334,10)
b = np.random.randn(46, 10)
out = broadcast_op(a,b)
这里 a 从 (92334,10) 填充到 (92368,10)。然后将a和b重新整形为(2008,46,10)和(1,46,10),之后可以广播操作ab。实际输出的形状为 (92368,),您可以通过切片 [:a_r] 简单地从中删除多余的部分。