首页 > 解决方案 > 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)

标签: pythonnumpypytorch

解决方案


如果将较大的填充到可被较小形状整除的形状,则可以在两者之间进行广播。

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] 简单地从中删除多余的部分。


推荐阅读