【问题标题】:“AttributeError: classificadorFinal' object has no attribute 'log_softmax” when trying to train a neural network using pytorch尝试使用 pytorch 训练神经网络时,“AttributeError:classificadorFinal”对象没有属性“log_softmax”
【发布时间】:2020-10-02 05:49:12
【问题描述】:

我正在学习使用 pytorch,但出现错误,无法继续编程。

我的代码:

import torch.nn as nn
from skorch import NeuralNetClassifier #integracao com sklearn
from sklearn.model_selection import cross_val_score,GridSearchCV
from sklearn.preprocessing import LabelEncoder, MinMaxScaler
import torch
import torch.nn.functional as F
from torch import nn,optim

class classificadorFinal(nn.Module):
    def __init__(self, activation=F.tanh, neurons=16, initializer=torch.nn.init.uniform_, dropout=0.3):
        ##from melhores_parametros
        super().__init__()
        self.dense0 = nn.Linear(4, neurons)
        initializer(self.dense0.weight)
        self.activation0 = activation
        self.dense1 = nn.Linear(neurons, neurons)
        initializer(self.dense1.weight)
        self.activation1 = activation
        self.dense2 = nn.Linear(neurons, 3)

        self.dropout = nn.Dropout(dropout)

    def forward(self, X):
        X = self.dense0(X)
        X = self.activation0(X)
        X = self.dropout(X)
        X = self.dense1(X)
        X = self.activation1(X)
        X = self.dropout(X)
        X = self.dense2(X)
        return X


criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(classificador.parameters(), lr = 0.001, weight_decay = 0.0001)


#treino
for epoch in range(200):##from melhores_parametros

    running_loss = 0.
    running_accuracy = 0.

    for data in train_loader:
        inputs, labels = data

        optimizer.zero_grad()        

        outputs = classificadorFinal(inputs)

        loss = criterion(outputs, labels)###erro
        loss.backward()

        optimizer.step()

        running_loss += loss.item()

        ps = F.softmax(outputs)

        top_p, top_class = ps.topk(k = 1, dim = 1)

        equals = top_class == labels.view(*top_class.shape)

        running_accuracy += torch.mean(equals.type(torch.float))

    print('Época {:3d}: perda {:3.5f} - precisão {:3.5f}'.format(epoch + 1, running_loss/len(train_loader), running_accuracy/len(train_loader)))

错误发生在loss = criterion(outputs, labels):

AttributeError: 'classificadorFinal' 对象没有属性 'log_softmax'

我发现这个错误是众所周知的,但我不明白建议的解决方案:

disable aux_logits模型创建时aux_logits=False.

请帮忙!

【问题讨论】:

    标签: python-3.x machine-learning neural-network pytorch


    【解决方案1】:

    输出实际上不是模型的输出,而是模型本身。 classificadorFinal 是类,调用它会创建该类的对象/实例,inputs 将是__init__ 方法的第一个参数,即activation

    # Creates an instance of the model
    outputs = classificadorFinal(inputs)
    

    您首先必须创建模型(一个实例),这应该完成一次,然后使用inputs 调用该模型。看起来您之前已经创建了模型,因为您使用 classificador.parameters() 作为优化器,因此 classificador 可能是模型的实例。您需要调用 classificador(实例)而不是 classificadorFinal(类)来创建输出。

    # Call the instance of the model, not the class 
    outputs = classificador(inputs)
    

    【讨论】:

    • Tks:如果我需要拯救训练有素的分类器,我使用“torch.save(classificador.state_dict(),'checkpoint.pth')”而不是“torch.save(classificadorFinal.state_dict( ), 'checkpoint.pth')" ?
    • 是的,没错,你总是使用模型的实例,即classificador
    猜你喜欢
    • 1970-01-01
    • 2020-04-11
    • 2018-10-30
    • 2011-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-02
    • 2018-08-19
    相关资源
    最近更新 更多