首页 > 解决方案 > 使用 PyTorch 训练神经网络时出现错误“‘Softmax’对象没有属性‘log_softmax’”

问题描述

我正在研究 MNIST 数据集的分类器。当我运行下面的代码时,我在 line 处收到错误“'Softmax' object has no attribute 'log_softmax'” loss = loss_function(output, y)。我还没有找到解决问题的方法。如果您能就如何解决该问题提出建议,我将不胜感激。谢谢你。

import matplotlib.pyplot as plt
import torch 
import torch.nn as nn
import torch.nn.functional as F 
import torch.optim as optim
from torch.utils.data import DataLoader, Dataset, TensorDataset
import torchvision
import torchvision.transforms as transforms
import numpy as np


device = torch.device("cuda") if torch.cuda.is_available() else torch.device("cpu")
batch_size = 512

# Image transformations of Torchvision will convert to the images to tensor and normalise with mean and standard deviation
transformer = transforms.Compose([transforms.ToTensor(), transforms.Normalize(mean=(0.1307,), std=(0.3081,))])

data_train = DataLoader(torchvision.datasets.MNIST('Data/data/mnist', download=True, train=True, transform=transformer), 
                batch_size=batch_size, drop_last=False, shuffle=True)
data_test = DataLoader(torchvision.datasets.MNIST('Data/data/mnist', download=True, train=False, transform=transformer), 
                batch_size=batch_size, drop_last=False, shuffle=True)


class neural_nw(nn.Module):
    
    def __init__(self):
        super(neural_nw, self).__init__()
        self.fc1 = nn.Linear(784, 128, True)
        self.fc2 = nn.Linear(128, 128, True)
        self.fc3 = nn.Linear(128, 10, True)
    
    def forward(self, x):
        output = torch.sigmoid(self.fc1(x))
        output = torch.sigmoid(self.fc2(output))
        output = nn.Softmax(self.fc3(output))
        return output
    
MLP = neural_nw()

loss_function = nn.CrossEntropyLoss()
optimiser = optim.Adam(MLP.parameters(), lr = 0.01)

Epochs = 50

for epoch in range(Epochs):
    for X, y in data_train:
        X = X.view(X.shape[0], -1)
        optimiser.zero_grad()
        output = MLP.forward(X)
        loss = loss_function(output, y)
        loss.backward()
        optimiser.step()

标签: machine-learningneural-networkpytorch

解决方案


nn.Softmax定义一个模块,nn.Modules定义为 Python 类并具有属性,例如,一个nn.LSTM模块将具有一些内部属性,例如self.hidden_size. 另一方面,F.softmax定义操作并需要传递所有参数(包括权重和偏差)。隐含地,模块通常会在方法中的某处调用它们的功能forward对应物。

这解释了为什么F.softmax而不是nn.Softmax解决您的问题。


推荐阅读