El modelo de carga causa un resultado diferente (probablemente el abandono activo)

En Pytorch cuando ejecuto un modelo después del entrenamiento (sin carga) obtengo buenos resultados. Pero cuando cargo el modelo obtengo resultados completamente diferentes que son falsos. Tengo un abandono en mi futuro. No puedo averiguar cómo hacer esto porque ha habido un solo post sobre él en un año y las cosas han cambiado en pytorch. Aquí está el código (tiene algunas características implementadas):

    class Netz(nn.Module):
    def __init__(self):
        super(Netz, self).__init__()
        self.conv1 = nn.Conv2d(1, 2, kernel_size=5) #(wir haben 3 input chanel, output chanel setzen wir auf 10) da wir mit Bilder arbeiten kommt eine convolutional Schicht rein, gleich als erstes
        self.conv2 = nn.Conv2d(2, 4, kernel_size=5) #normalerweise macht man gleich mehrere convolutional Schichten
        self.conv3 = nn.Conv2d(4, 8, kernel_size=5) #mit den Zahlen kann man am Ende noch ein bisschen herumspielen
        self.fc1 = nn.Linear(7616, 1000)
        #fully connected layer soll als input genau die Anzahl an Neuronen haben, die torch.Size(, ., ., .) => . mal . mal .  ausspuckt
        self.fc2 = nn.Linear(1000, 2)
        
    def forward(self, x): #gehen davon aus, dass irgendetwas kaputt gehen wird
        x = self.conv1(x)
        x = F.relu(x)
        x = F.max_pool2d(x,2)
        x = self.conv2(x)
        x = F.relu(x)
        x = F.max_pool2d(x,2)
        x = self.conv3(x)
        x = F.relu(x)
        x = F.max_pool2d(x,2)          
        x = x.view(-1, 7616) #-1, da der erste Wert, also die batch size, uns nicht interessiert
        x = F.relu(self.fc1(x)) # als Aktivierungslayer für unser erstes fully connected layer
        x = F.dropout(x)
        x = self.fc2(x)
        return F.softmax(x, dim=1)
        #jetzt müssen wir in unseren fully connected layer umsteigen, aber wir wissen ja nicht, wie unsere Daten in dem Fall jetzt aussehen
        exit()

model = Netz()
optimizer = optim.RMSprop(model.parameters(), lr = 0.001) #Learning rate

def train(epoch): #model existiert zwar noch nicht, aber wir erschaffen uns unser eigenes model
    model.train() #model auf train setzen, damit es auch wirklich trainiert wird und nicht nur ausgeführt
    for idx, (data, target) in enumerate(train_data): # Daten aus vorgefertigten Daten beziehen, wir brauchen hier die train data
        target = torch.Tensor(target)
        data = Variable(data)
        target = Variable(target) # müssen data und target ja immer noch als Variablen verarbeiten
        optimizer.zero_grad() #setzen unseren Gradienten auf 0, damit wir überhaupt etwas lernen können
        out = model(data) #output soll das model data sein
        criterion = F.binary_cross_entropy #wollen ja Bilder klassifizieren in zwei Klassen
        loss = criterion(out, target) #wollen unser Loss als criterion von output und target berechnen -- zu beachten: target hat zwei Elemente und am Ende soll unser output auch zwei Elemente haben
        loss.backward() # wollen unseren Loss back - propagaten
        optimizer.step() # wollen unseren Optimizer sagen, dass er etwas tun soll
# das war es mit unserem Trainingsalgorithmus 

epoch_num = range(0,int(args.epochs))

if path.exists(args.model) == False: #wir schauen ob unsere Model schon trainiert ist
    for idx, epoch in enumerate(epoch_num, start=1): #wollen 30 epcohen lang trainieren
        print("Epoch " + str(idx) + " out of " + str(max(epoch_num)+1) + " started!")
        train(epoch)    
        print("Epoch " + str(idx) + " out of " + str(max(epoch_num)+1) + " finished!")
    torch.save(model, args.model) #wir speichern unsere trainierte Model
else:
    model = torch.load(args.model)

Pregunta hecha hace 3 años, 4 meses, 28 días - Por compilerczar


2 Respuestas:

  • El problema que estás experimentando probablemente se deba a que al cargar el modelo guardado, las capas dropout y softmax no se están aplicando de la misma manera como lo hacías durante el entrenamiento. Es importante asegurarse de que el modelo esté en modo de evaluación (model.eval()) después de cargarlo para deshabilitar el dropout y usar softmax de manera adecuada.

    Aquí te muestro cómo puedes modificar tu código para incorporar esta corrección:

    python
    if path.exists(args.model) == False: 
        for idx, epoch in enumerate(epoch_num, start=1):
            print("Epoch " + str(idx) + " out of " + str(max(epoch_num)+1) + " started!")
            train(epoch)    
            print("Epoch " + str(idx) + " out of " + str(max(epoch_num)+1) + " finished!")
        torch.save(model, args.model) 
    else:
        model = torch.load(args.model)
        model.eval()  

    Modo evaluación

    Ejecutar el modelo en modo evaluación para obtener resultados

    model.eval() with torch.no_grad(): for idx, (data, target) in enumerate(test_data):

    Realizar las mismas transformaciones que durante el entrenamiento

    target = torch.Tensor(target) data = Variable(data) target = Variable(target)

    Obtener la predicción del modelo

    out = model(data)

    Convertir las salidas en predicciones

    _, predicted = torch.max(out, 1)

    Calcular métricas de evaluación, etc.

    Asegúrate de aplicar este cambio después de cargar el modelo. Esto debería ayudarte a obtener resultados consistentes tanto durante el entrenamiento como durante la evaluación con el modelo cargado.

    Respondida el Dec 19, 2020 a las 11:58 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • El problema:

    El abandono (dropout) no se está aplicando correctamente después de cargar el modelo. Esto se debe a que el abandono es un proceso estocástico que se deshabilita durante la evaluación.

    Solución:

    Para habilitar el abandono después de cargar el modelo, debes establecer el modo de entrenamiento del modelo en True y establecer el modo de abandono en True antes de realizar la predicción.

    Código actualizado:

    python
    if path.exists(args.model) == False:
        

    Código de entrenamiento sin cambios...

    else: model = torch.load(args.model)

    Establece el modo de entrenamiento en True

    model.train()

    Establece el modo de abandono en True

    model.eval()

    Realiza la predicción...

    Establecer el modo de entrenamiento en True habilita el abandono, mientras que establecer el modo de abandono en True asegura que el abandono se aplique durante la evaluación.

    Respondida el Dec 19, 2020 a las 12:02 - por Gemini

    Votos positivos: 0 | Votos negativos: 0