我有一個簡單的神經網路:
import torch
import torch.nn as nn
import torch.optim as optim
class Model(nn.Module):
def __init__(self):
super(Model, self).__init__()
self.fc1 = nn.Linear(1, 5)
self.fc2 = nn.Linear(5, 10)
self.fc3 = nn.Linear(10, 1)
def forward(self, x):
x = self.fc1(x)
x = torch.relu(x)
x = torch.relu(self.fc2(x))
x = self.fc3(x)
return x
net = Model()
opt = optim.Adam(net.parameters())
我還有一些輸入功能:
features = torch.rand((3,1))
我可以用一個簡單的 MSE 損失函式正常訓練它:
for i in range(10):
opt.zero_grad()
out = net(features)
loss = torch.mean(torch.square(torch.tensor(5) - torch.sum(out)))
print('loss:', loss)
loss.backward()
opt.step()
但是,我正在嘗試創建一個將實際權重值考慮在內的損失函式:
loss = 1 - torch.mean(torch.tensor([torch.sum(w_arr) for w_arr in net.parameters()]))
但我收到一個錯誤:
RuntimeError: element 0 of tensors does not require grad and does not have a grad_fn
這里的目標是使每個權重的值盡可能接近 1(或任何其他值)。
uj5u.com熱心網友回復:
一個快速的錯誤修復方法是requires_grad = True在創建張量時包含。這邊走 -
loss = 1 - torch.mean(torch.tensor([torch.sum(w_arr) for w_arr in net.parameters()], requires_grad=True))
但是當將權重串列轉換為張量時,火炬不知道該張量的來源,因此損失不會減少。一種方法是
for i in range(500):
opt.zero_grad()
out = net(features)
loss = torch.mean(torch.square(torch.tensor(5) - torch.sum(out)))
len_w = 0
for w_arr in net.parameters():
loss = torch.mean(torch.abs(1 - w_arr))
len_w = 1
loss /= len_w
print('loss:', loss)
loss.backward()
opt.step()
在這種損失計算方式中,它確保所有權重都接近 1。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/334187.html
