【问题标题】:Tensorflow to PyTorch - model.predict equivalentTensorflow 到 PyTorch - model.predict 等效
【发布时间】:2020-10-30 12:02:16
【问题描述】:
  1. 我正在尝试检索我的训练的均方误差。在基于 TensorFlow 的原始代码中,我将此代码移至 PyTorch(出于研究原因)。

    原始 TensorFlow 代码:

    print("Calculating threshold")
    x_opt_predictions = model.predict(x_opt)
    print("Calculating MSE on optimization set...")
    mse = np.mean(np.power(x_opt - x_opt_predictions, 2), axis=1)
    print("mean is %.5f" % mse.mean())
    print("min is %.5f" % mse.min())
    print("max is %.5f" % mse.max())
    print("std is %.5f" % mse.std())
    tr = mse.mean() + mse.std()

pytorch的训练方法:

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()

        print(f"Epoch: {epoch}. Loss: {loss}")
        print("opt", x_opt.size(), "output", outputs.__sizeof__())

    # VVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
    return np.mean(np.power(x_opt - outputs, 2), axis=1)
    # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  1. 如上所示,“输出”行不是预测的 numpy 数组,获取此等价物以生成阈值

  2. 如果有任何其他(改进的或缺失的)方法可以获取此价值,请提前欣赏。

【问题讨论】:

    标签: python tensorflow pytorch


    【解决方案1】:

    变量输出是一个 pytorch 张量,可以将其转换为 numpy,您只需将这行代码 return np.mean(np.power(x_opt - outputs, 2), axis=1) 更改为 return np.mean(np.power(x_opt - outputs.cpu().data.numpy(), 2), axis=1),这会将张量转换为 numpy 数组。如果您的网络没有使用 cuda,则不需要 .cpu() 部分。

    【讨论】:

    • 那么我的数据可能仍然存在一些潜在问题,现在我得到:ValueError: operands could not be broadcast together with shapes (92334,10) (46,10)
    • 那是因为当您从 x_opt 中减去输出时,您只是使用最后一步的输出而不是整个时期的输出,因此 x_opt 具有更大的 batch_size,因为它是整个数据集,而输出只是数据集的一部分。您可以改为使用 mse 变量并在每一步都添加到它,并在 epoch 结束时返回它。像这样 mse += np.mean(np.power(batch_y - outputs.cpu().data.numpy(), 2), axis=1) 然后最后只是 return mse 而不是使用 x_opt 您将使用 batch_y 因为它们引用相同的输入并且具有相同的大小。
    猜你喜欢
    • 2020-09-26
    • 2021-08-01
    • 2022-10-12
    • 2019-01-02
    • 2020-03-28
    • 2021-11-29
    • 1970-01-01
    • 2021-01-31
    • 2021-07-04
    相关资源
    最近更新 更多