#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 на самом деле не подходит для задачи классификации. Кроме того, вы нормализовали свой ввод?