В pytorch модель обучается случайным образом при использовании одного и того же сценария и модели

#python #deep-learning #neural-network #pytorch

Вопрос:

Я создаю модель нейронной сети, используя pytorch. Я построил простую и неглубокую 3-слойную модель, обратившись к учебнику. Однако обучение является случайным, несмотря на использование одной и той же модели и сценария. Другими словами, можно видеть, что потеря не падает примерно один раз из 4, поэтому она не тренируется. Я не знаю, почему модель неглубока и нестабильна. Я был бы признателен, если бы кто-то с таким же опытом, как у меня, или кто решил проблему, мог дать совет.

введите описание изображения здесь, это тот же результат выполнения сценария. 1 из 4 раз не тренировался. но я использовал тот же сценарий и ту же модель. Значение входного тензора одинаково как в случае обучения, так и в случае не обучения.

мой сценарий находится здесь. и форма ввода x равна [10000, 1]

 import os
import pandas as pd
from sklearn.preprocessing import StandardScaler
import numpy as np

import torch.nn as nn
import torch.optim as optim

from sklearn.preprocessing import StandardScaler

import sys
import torch
from sklearn.preprocessing import StandardScaler
import re

os.chdir("...")
F1 = os.listdir(os.getcwd())
print(F1)


df = pd.read_excel('10000.xlsx', sheet_name=1)

Ang_tilt = torch.from_numpy(df['Ang_tilt'].values).unsqueeze(dim=1).float()
    
x_list = [Ang_tilt]

nb_epochs = 3000

import sys

#from aug_data_processing import *

import torch.nn as nn
import torch.optim as optim

from sklearn.preprocessing import StandardScaler

from matplotlib import pyplot as plt

########################################
####################model

#print(x_list)




net = Net(x_dim=Ang_tilt.size()[1])

criterion = nn.MSELoss()
# optimizer = torch.optim.Adam(model.parameters(), lr=1e-9)
optimizer = torch.optim.SGD(net.parameters(), lr=1e-6, momentum=0.7)
losses = []

################forward

for step in range(nb_epochs   1):
    
    scaler = StandardScaler()

    Ang_tilt = scaler.fit_transform(Ang_tilt)
    Ang_tilt = torch.from_numpy(Ang_tilt).float()
    

    #print(x_list[i])
    prediction = net(Ang_tilt)
    #print(prediction)
    

    loss = criterion(input=prediction, target=y_label)
    optimizer.zero_grad()

    losses.append(loss.item())
    loss.backward()
    optimizer.step()

#print(Ang_tilt)
plt.title('3_layer_NN_loss_pre post')
plt.xlabel('epoch')
plt.ylabel('losses')
plt.plot(range(nb_epochs 1), losses)

plt.show()






torch.save(obj=net, f='aug.pt')
 

И это сеть

 from torch import nn
from torch.nn import functional as F
import torch

import torch
from torch.autograd import Variable
'''
x_dim = dimension을 바로

'''
class Net(nn.Module):
    def __init__(self, x_dim):
        super(Net, self).__init__()

        self.fc1 = nn.Linear(x_dim, 150)
        self.fc2 = nn.Linear(150, 100)
        self.fc3 = nn.Linear(100, 40)
        self.fc4 = nn.Linear(40,1)
        self.dropout = nn.Dropout(p=0.5)

        torch.nn.init.xavier_uniform_(self.fc1.weight)
        torch.nn.init.xavier_uniform_(self.fc2.weight)
        torch.nn.init.xavier_uniform_(self.fc3.weight)
        torch.nn.init.xavier_uniform_(self.fc4.weight)


    def forward(self, x):
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        x = F.relu(self.fc3(x))
        x = F.relu(self.fc4(x))


        return x
 

Комментарии:

1. Вы можете один раз выделить функции (т. е.) Ang_tilt = scaler.fit_transform(Ang_tilt) вне цикла обучения, почему у вас такой низкий уровень обучения (lr=1e-6) . И модель будет обучаться случайным образом, так как веса инициализируются случайным образом.

2. Мне приходится обучать множество переменных с одной и той же моделью, поэтому я хочу выделиться внутри цикла. и высокий уровень обучения не способствуют хорошему обучению ;( … Спасибо тебе.!!!

Ответ №1:

Я нашел его, распечатав свои параметры. Когда не тренируешься, вес такой низкий. поэтому я изменил структуру модели, чем решил.