【问题标题】:cross_entropy_loss(): argument 'target' (position 2) must be Tensor, not numpy.ndarraycross_entropy_loss():参数“目标”(位置 2)必须是张量,而不是 numpy.ndarray
【发布时间】:2021-11-15 13:16:58
【问题描述】:

数据准备和模型构建:

dataset = datasets.load_iris()
data = dataset.data
target = dataset.target
data_tensor=torch.from_numpy(data).float()
target_tensor=torch.from_numpy(target).long()

model = nn.Sequential(
    bnn.BayesLinear(prior_mu=0, prior_sigma=0.1, in_features=4, out_features=100),
    nn.ReLU(),
    bnn.BayesLinear(prior_mu=0, prior_sigma=0.1, in_features=100, out_features=3),
)
cross_entropy_loss = nn.CrossEntropyLoss()
klloss = bnn.BKLLoss(reduction='mean', last_layer_only=False)
klweight = 0.01
optimizer = optim.Adam(model.parameters(), lr=0.01)

运行模型:发生错误

for step in range(3000):
    models = model(data_tensor)
    cross_entropy = cross_entropy_loss(models, target)
    kl = klloss(model)
    total_cost = cross_entropy + klweight*kl

    optimizer.zero_grad()
    total_cost.backward()
    optimizer.step()
  
_, predicted = torch.max(models.data, 1)
final = target_tensor.size(0)
correct = (predicted == target_tensor).sum()
print('- Accuracy: %f %%' % (100 * float(correct) / final))
print('- CE : %2.2f, KL : %2.2f' % (cross_entropy.item(), kl.item()))
TypeError 
----> 3     cross_entropy = cross_entropy_loss(models, target)
TypeError: cross_entropy_loss(): argument 'target' (position 2) must be Tensor, not numpy.ndarray

我从网络学习页面复制代码,但显示附加错误,有什么建议吗?非常感谢!!

【问题讨论】:

  • TypeError: cross_entropy_loss(): argument 'target' (position 2) must be Tensor, not numpy.ndarray

标签: python pytorch


【解决方案1】:

您为目标使用了错误的变量。

cross_entropy_loss(models, target)

会

cross_entropy_loss(models, target_tensor)

【讨论】:

    【解决方案2】:

    张量是更广义的向量。因此每个张量都可以表示为多维数组或向量,但并非每个向量都可以表示为张量。

    因此 numpy 数组可以很容易地替换为 tensor ,但张量不能替换为 numpy 数组

    crossentropyloss 期望将张量作为参数传递,但您的 target 变量是 numpy 数组,因此会引发错误。通过target_tensor 变量而不是target 它将解决问题。

    阅读更多关于无交叉熵的信息here

    【讨论】:

    • 谢谢你的解释!!!您能否查看我关于目标 # 超出范围的其他问题? stackoverflow.com/questions/69969094/…
    • 如果答案正确,请选择它,因为这将有助于未来的观众立即找到答案。谢谢。
    猜你喜欢
    • 2020-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-21
    • 2020-10-12
    • 1970-01-01
    相关资源
    最近更新 更多