簡體   English   中英

Torch 神經網絡不訓練

[英]Torch neural network does not train

我在torch框架中實現了一個非常簡單的神經網絡

def mlp(sizes, activation, output_activation=torch.nn.Identity):
layers = []
for j in range(len(sizes)-1):
    act = activation if j < len(sizes)-1 else output_activation
    layers += [torch.nn.Linear(sizes[j], sizes[j+1]), act()]
return torch.nn.Sequential(*layers)

為了訓練網絡對函數 y=sin(x) 進行回歸

x = torch.linspace(-math.pi, math.pi, 2000, device=device, dtype=dtype)
y = torch.sin(x)

培訓代碼在這里

size = [1,20,20,1]
activation = torch.nn.ReLU
model = mlp(size, activation)

optimizer = torch.optim.SGD(model.parameters(), lr=0.002)

n_epoch = 600
mse_loss = torch.nn.MSELoss()
X = x.unsqueeze(-1)
for i in range(n_epoch):
    y_pred = model(X)
    step_loss = mse_loss(y_pred, y)
    optimizer.zero_grad()
    step_loss.backward()
    optimizer.step()

不幸的是,網絡只學習了一個幾乎恆定的函數 $y=0$。 我已經嘗試了很多東西

  1. 更改網絡的超參數
  2. 在訓練中添加小批量
  3. 更改 epoch 數和學習率

但似乎沒有任何效果。 問題很簡單,我認為代碼中有錯誤。

我不確定這是否是主要原因,但聲明

act = activation if j < len(sizes)-1 else output_activation

似乎邏輯不正確。 在循環中, j可以取從0len(sizes)-1的值,因此條件始終為真。 這意味着你的網絡最后有一個 ReLU,因此只能給出非負輸出。 這可以通過將該語句更改為:

act = activation if j < len(sizes)-2 else output_activation

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM