Неправильно обновляется средняя ошибка и стандартное отклонение ошибки в эпоху - PyTorch - PullRequest
0 голосов
/ 06 ноября 2019

Я пытаюсь использовать Stochastic Gradient Descent, но я не уверен, почему моя ошибка / потеря не уменьшается. Информация, которую я использую из train фрейма данных, - это индекс (каждая последовательность) и аффинность связывания, и цель состоит в том, чтобы предсказать аффинность связывания. Вот как выглядит заголовок информационного кадра:

enter image description here

Для обучения я делаю горячую последовательность и вычисляю балл с помощьюдругой матрицы, и цель состоит в том, чтобы этот показатель был как можно ближе к аффинности связывания (для любого данного пептида). То, как я вычисляю счет и мой цикл обучения, показано в моем коде ниже, но я не думаю, что объяснение необходимо, чтобы решить, почему моя ошибка не уменьшается.

#ONE-HOT ENCODING
AA=['A','R','N','D','C','Q','E','G','H','I','L','K','M','F','P','S','T','W','Y','V']
loc=['N','2','3','4','5','6','7','8','9','10','11','C']
aa = "ARNDCQEGHILKMFPSTWYV"
def p_one_hot(seq):
    c2i = dict((c,i) for i,c in enumerate(aa))
    int_encoded = [c2i[char] for char in seq]
    onehot_encoded = list()
    for value in int_encoded:
        letter = [0 for _ in range(len(aa))]
        letter[value] = 1
        onehot_encoded.append(letter)
    return(torch.Tensor(np.transpose(onehot_encoded)))

#INITALIZE TENSORS
a=Var(torch.randn(20,1),requires_grad=True) #initalize similarity matrix - random array of 20 numbers
freq_m=Var(torch.randn(12,20),requires_grad=True)
freq_m.data=(freq_m.data-freq_m.min().data)/(freq_m.max().data-freq_m.min().data)#0 to 1 scaling 
optimizer = optim.SGD([torch.nn.Parameter(a), torch.nn.Parameter(freq_m)], lr=1e-6)
loss = nn.MSELoss()

#TRAINING LOOP  
epochs = 100
for i in range(epochs): 
    #RANDOMLY SAMPLE DATA
    train = all_seq.sample(frac=.03)
    names = train.index.values.tolist()
    affinities = train['binding_affinity']
    print('Epoch: ' + str(i))
    #forward pass    
    iteration_loss=[]
    for j, seq in enumerate(names):
        sm=torch.mm(a,a.t()) #make simalirity matrix square symmetric
        freq_m.data=freq_m.data/freq_m.data.sum(1,keepdim=True) #sum of each row must be 1 (sum of probabilities of each amino acid at each position)
        affin_score = affinities[j]
        new_m = torch.mm(p_one_hot(seq), freq_m)
        tss_m = new_m * sm
        tss_score = tss_m.sum()
        sms = sm
        fms = freq_m
        error = loss(tss_score, torch.FloatTensor(torch.Tensor([affin_score])))
        iteration_loss.append(error.item())
        optimizer.zero_grad()
        error.backward()
        optimizer.step()
    mean = statistics.mean(iteration_loss)
    stdev = statistics.stdev(iteration_loss)       
    print('Epoch Average Error: ' + str(mean) + '. Epoch Standard Deviation: ' + str(stdev))
    iteration_loss.clear()

После каждой эпохи я распечатываюсреднее значение всех ошибок за эту эпоху, а также стандартное отклонение. Каждая эпоха проходит около 45 000 последовательностей. Тем не менее, после 10 эпох я все еще не вижу каких-либо улучшений с моей ошибкой, и я не знаю, почему. Вот вывод, который я вижу: enter image description here

Есть какие-нибудь идеи относительно того, что я делаю неправильно? Я новичок в PyTorch, поэтому любая помощь приветствуется! Спасибо!

1 Ответ

0 голосов
/ 13 ноября 2019

Оказывается, что приведение параметров оптимизатора в torch.nn.Parameter () заставляет тензоры не удерживать обновления, и удаление этого теперь показывает уменьшающуюся ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...