[英]PyTorch Linear Regression Issue
我正在嘗試在PyTorch中實現一個簡單的線性模型,該模型可以提供x數據和y數據,然后經過訓練可以識別方程y = mx + b。 但是,每當我嘗試在訓練后測試模型時,它都會認為方程為y = mx + 2b。 我將展示我的代碼,希望有人能夠發現問題。 預先感謝您的任何幫助。
import torch
D_in = 500
D_out = 500
batch=200
model=torch.nn.Sequential(
torch.nn.Linear(D_in,D_out),
)
接下來,我創建一些數據並設置規則。 讓我們做3x + 4。
x_data=torch.rand(batch,D_in)
y_data=torch.randn(batch,D_out)
for i in range(batch):
for j in range(D_in):
y_data[i][j]=3*x_data[i][j]+5 # model thinks y=mx+c -> y=mx+2c?
loss_fn=torch.nn.MSELoss(size_average=False)
optimizer=torch.optim.Adam(model.parameters(),lr=0.001)
現在要訓練...
for epoch in range(500):
y_pred=model(x_data)
loss=loss_fn(y_pred,y_data)
optimizer.zero_grad()
loss.backward()
optimizer.step()
然后,我使用僅為1的張量/矩陣測試模型。
test_data=torch.ones(batch,D_in)
y_pred=model(test_data)
現在,我希望得到3 * 1 + 4 = 7,但是我的模型認為是11。
[[ 10.7286, 11.0499, 10.9448, ..., 11.0812, 10.9387,
10.7516],
[ 10.7286, 11.0499, 10.9448, ..., 11.0812, 10.9387,
10.7516],
[ 10.7286, 11.0499, 10.9448, ..., 11.0812, 10.9387,
10.7516],
...,
[ 10.7286, 11.0499, 10.9448, ..., 11.0812, 10.9387,
10.7516],
[ 10.7286, 11.0499, 10.9448, ..., 11.0812, 10.9387,
10.7516],
[ 10.7286, 11.0499, 10.9448, ..., 11.0812, 10.9387,
10.7516]])
同樣,如果我將規則更改為y = 3x + 8,我的模型將猜測為19。因此,我不確定發生了什么。 為什么常數要加兩次? 順便說一句,如果我只是將規則設置為y = 3x,則我的模型可以正確推斷3,而對於y = mx,通常我的模型可以正確推斷m。 由於某種原因,常數項將其拋棄。 非常感謝您為解決該問題提供的幫助。 謝謝!
您的網絡學習時間不夠長。 它獲得具有500個特征的矢量來描述單個基准。
您的網絡必須將500個要素的大輸入映射到包含500個值的輸出。 您的訓練數據是隨機創建的,不像您的簡單示例那樣,因此我認為您只需要訓練更長的時間以適合您的權重即可將此函數從R ^ 500近似為R ^ 500。
如果減少輸入和輸出尺寸並增加批次大小,學習率和培訓步驟,我將得到預期的結果:
import torch
D_in = 100
D_out = 100
batch = 512
model=torch.nn.Sequential(
torch.nn.Linear(D_in,D_out),
)
x_data=torch.rand(batch,D_in)
y_data=torch.randn(batch,D_out)
for i in range(batch):
for j in range(D_in):
y_data[i][j]=3*x_data[i][j]+4 # model thinks y=mx+c -> y=mx+2c?
loss_fn=torch.nn.MSELoss(size_average=False)
optimizer=torch.optim.Adam(model.parameters(),lr=0.01)
for epoch in range(10000):
y_pred=model(x_data)
loss=loss_fn(y_pred,y_data)
optimizer.zero_grad()
loss.backward()
optimizer.step()
test_data=torch.ones(batch,D_in)
y_pred=model(test_data)
print(y_pred)
如果只想用一個輸入來近似f(x) = 3x + 4
,則也可以將D_in
和D_out
設置為1。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.