【问题标题】:How to train pytorch model with numpy data and batch size?如何使用 numpy 数据和批量大小训练 pytorch 模型?
【发布时间】:2018-02-20 14:05:59
【问题描述】:

我正在学习 pytorch 的基础知识,并想创建一个带有 dropout 的简单 4 层神经网络来训练 IRIS 数据集进行分类。在参考了很多教程后,我编写了这段代码。

import pandas as pd
from sklearn.datasets import load_iris
import torch
from torch.autograd import Variable

epochs=300
batch_size=20
lr=0.01

#loading data as numpy array
data = load_iris()
X=data.data
y=pd.get_dummies(data.target).values

#convert to tensor
X= Variable(torch.from_numpy(X), requires_grad=False)
y=Variable(torch.from_numpy(y), requires_grad=False)
print(X.size(),y.size())

#neural net model
model = torch.nn.Sequential(
    torch.nn.Linear(4, 10),
    torch.nn.ReLU(),
    torch.nn.Dropout(),
    torch.nn.Linear(10, 5),
    torch.nn.ReLU(),
    torch.nn.Dropout(),
    torch.nn.Linear(5, 3),
    torch.nn.Softmax()
)

print(model)

# Loss and Optimizer
optimizer = torch.optim.Adam(model.parameters(), lr=lr)  
loss_func = torch.nn.CrossEntropyLoss()  

for i in range(epochs):
    # Forward pass
    y_pred = model(X)

    # Compute and print loss.
    loss = loss_func(y_pred, y)
    print(i, loss.data[0])

    # Before the backward pass, use the optimizer object to zero all of the
    # gradients for the variables it will update (which are the learnable weights
    # of the model)
    optimizer.zero_grad()

    # Backward pass
    loss.backward()

    # Calling the step function on an Optimizer makes an update to its parameters
    optimizer.step()

我目前面临两个问题。

  1. 我想将批处理大小设置为20。我该怎么做?
  2. 在这一步y_pred = model(X) 显示此错误

错误

 TypeError: addmm_ received an invalid combination of arguments - got (int, int, torch.DoubleTensor, torch.FloatTensor), but expected one of:
 * (torch.DoubleTensor mat1, torch.DoubleTensor mat2)
 * (torch.SparseDoubleTensor mat1, torch.DoubleTensor mat2)
 * (float beta, torch.DoubleTensor mat1, torch.DoubleTensor mat2)
 * (float alpha, torch.DoubleTensor mat1, torch.DoubleTensor mat2)
 * (float beta, torch.SparseDoubleTensor mat1, torch.DoubleTensor mat2)
 * (float alpha, torch.SparseDoubleTensor mat1, torch.DoubleTensor mat2)
 * (float beta, float alpha, torch.DoubleTensor mat1, torch.DoubleTensor mat2)
      didn't match because some of the arguments have invalid types: (int, int, torch.DoubleTensor, !torch.FloatTensor!)
 * (float beta, float alpha, torch.SparseDoubleTensor mat1, torch.DoubleTensor mat2)
      didn't match because some of the arguments have invalid types: (int, int, !torch.DoubleTensor!, !torch.FloatTensor!)

【问题讨论】:

  • 问题解决了吗?
  • 对不起,我无法解决这个问题。如果您有解决方案,请发布它

标签: python pytorch


【解决方案1】:

我想将批量大小设置为 20。我应该怎么做?

对于数据的处理和加载,PyTorch 提供了两个类,一个是Dataset,用来表示你的数据集。具体来说,Dataset 提供了使用样本索引从整个数据集中获取一个样本的接口。

但是Dataset还不够,对于大数据集,我们需要做批处理。因此 PyTorch 提供了第二个类 Dataloader,它用于在给定批量大小和其他参数的情况下从 Dataset 生成批量。

对于您的具体情况,我认为您应该尝试TensorDataset。然后使用 Dataloader 将批量大小设置为 20。只需查看 PyTorch official examples 即可了解如何操作。

在这一步 y_pred = model(X) 显示此错误

错误消息非常有用。您对模型的输入X 是类型DoubleTensor。但是您的模型参数的类型为FloatTensor。在 PyTorch 中,您不能在不同类型的 Tensor 之间进行操作。你应该做的是替换行

X= Variable(torch.from_numpy(X), requires_grad=False)

X= Variable(torch.from_numpy(X).float(), requires_grad=False)

现在,X 的类型为 FloatTensor,错误消息应该会消失。

另外,作为一个温馨提示,互联网上有很多关于您的问题的材料,可以充分解决您的问题。你应该努力自己解决。

【讨论】:

  • 现在它显示此错误TypeError: FloatClassNLLCriterion_updateOutput received an invalid combination of。如果可以,您可以分享完全解决的代码。在过去的两个月里,我被困在这里,无法在 pytorch 中获得任何知识。有时我们会陷入我们似乎无法找到解决方案的地方,而我目前处于这个位置。任何帮助将不胜感激。
  • 请更新您的代码,然后我会发现您的代码有什么问题。我试过自己跑,效果很好。随着训练的进行,损失会减少,请参阅here
【解决方案2】:

可能同样的问题:Pytorch: Convert FloatTensor into DoubleTensor

简而言之:从 numpy 转换时,值存储在 DoubleTensor 中,而优化器需要 FloatTensor。您必须更改其中之一。

【讨论】:

    猜你喜欢
    • 2019-04-02
    • 2021-06-17
    • 2019-12-29
    • 2021-05-22
    • 2020-05-27
    • 2019-05-04
    • 2021-07-01
    • 2020-05-06
    • 2020-09-26
    相关资源
    最近更新 更多