пайторч, похоже, не учится

#python #neural-network #pytorch

Вопрос:

Я импортирую данные из файла

 Y = np.genfromtxt('datay.txt', dtype=np.float32)
X = np.genfromtxt('datax.txt', dtype=np.float32)
 

чья форма

 Y.shape  (1000, 30)
X.shape  (1000, 30)
 

поскольку они представляют собой наборы из тысячи функций. Моя нейронная сеть (pytorch) должна угадать Y данные X . Далее:

 import tensorflow as tf
from sklearn.model_selection import train_test_split

xtrain, xtest, ytrain, ytest = train_test_split (X,Y,test_size=.2)

nof_train_dist=xtrain.shape[0]
nof_test_dist=xtest.shape[0]
 

Вопрос № 1, необходимо ли это разделение?

NN определяется как

 N = X.shape[1]
M = Y.shape[1]
HL = N*100

class Net(nn.Module):
    def __init__(self):
        super().__init__()
        self.fc1 = nn.Linear(N, HL)
        self.fc2 = nn.Linear(HL, HL)
        self.fc3 = nn.Linear(HL, HL)
        self.fc4 = nn.Linear(HL, M)
    def forward(self, x):
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        x = F.relu(self.fc3(x))
        x = self.fc4(x)
        return F.log_softmax(x, dim=1)

net = Net()
print ("net -> ", net)
 

Окончательно

 import torch.optim as optim

optimizer = optim.Adam(net.parameters(),lr=0.001) 

EPOCHS = 3

from tqdm import tqdm
from tqdm import trange

#reducing learning rate
def adjust_learning_rate(optimizer, epoch):
    """Sets the learning rate to the initial LR decayed to 10 percent every 1 epoch(s)"""
    for param_group in optimizer.param_groups:
        param_group['lr'] *= (0.1 ** (epoch // 1))

#training

xtrain = torch.tensor(xtrain)
ytrain = torch.tensor(ytrain)
xtest = torch.tensor(xtest)
ytest = torch.tensor(ytest)

for epoch in range (EPOCHS):
    print ("Epoch ", epoch 1, "/", EPOCHS)
    for data in trange (nof_train_dist):
        #data is both featuresets and labels
    
        x = xtrain[data]
        y = ytrain[data]
        net.zero_grad() 
        out = net (x.view(-1,N))
        loss = nn.L1Loss()
        output = loss(out.view(-1,M),y.view(-1,M))
        output.backward()
        optimizer.step() #it adjusts the w for me
        
    adjust_learning_rate (optimizer,epoch)
    print (output)
    for param_group in optimizer.param_groups:
        print ("param group: ", param_group['lr'])

#X_final is inputed from file
X_final = torch.tensor (X_final_test)
pred = net (X_final.view(-1,N))

X_ = []
for i in range (M):
    X_.append(i)

pred = pred.detach().numpy()
y_final_test = np.array(y_final_test)

plt.scatter(X_,pred,label='Predicted')
plt.scatter(X_,Y_final_test,label='True')
plt.scatter(X_,AVG,label='Average')
plt.legend(loc='upper left')
plt.show()
 

NN не учится! Может быть, другая функция потерь решила бы проблему? Что я делаю не так?

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

1. Возможно, вам следует использовать другую функцию, L1 на самом деле не подходит для задачи классификации. Кроме того, вы нормализовали свой ввод?