[英]can't classify the inputs of an formula by output.(celcius-fahrenheit)
我正在自己學習深度學習一段時間。 但是,我嘗試在 pytorch 中建立一個分類 model。輸入和 output 可以從 celcius celcius-fahrenheit
fahrenheit 的公式中獲取。
C = (F-32)/1.8
輸入是fahrenheit
值,輸出被分類為negative value-0
或positive value-1
。
輸入 | Output |
---|---|
... | 1個 |
34 | 1個 |
33 | 1個 |
32 | 0 |
31 | 0 |
... | 0 |
我嘗試了以下管道,但我無法配置 model 以 %100 的准確度預測測試。 如何達到這個預測准確率?
import torch
import numpy as np
x = np.arange(-100,100)
y = np.where(((x-32)*1.8)>0, 1., 0.)
x = torch.from_numpy(x).to(torch.float32).unsqueeze(1)
y = torch.from_numpy(y).to(torch.float32).unsqueeze(1)
class BasicModel(torch.nn.Module):
def __init__(self,in_features:int,out_features:int):
super(BasicModel,self).__init__()
self.in_features = in_features
self.out_features = out_features
self.linear = torch.nn.Linear(in_features=self.in_features,out_features=self.out_features)
self.sigmoid = torch.nn.Sigmoid()
def forward(self,input):
out = self.linear(input)
out = self.sigmoid(out)
return out
model = BasicModel(1,1)
loss_func = torch.nn.BCELoss()
optimizer = torch.optim.SGD(model.parameters(),lr=0.1)
epochs = 1000
model.train()
for epoch in range(epochs):
losses = []
for value,target in zip(x,y):
optimizer.zero_grad()
prediction = model(value)
loss = loss_func(prediction,target)
loss.backward()
optimizer.step()
losses.append(loss)
if epoch%100 ==0:
for name, param in model.named_parameters():
print(name, param.data,end = " ")
print(f"Epoch:{epoch} loss:{sum(losses)/len(losses)}")
x_test = torch.tensor([[33.],
[32.]]) # 2 sample test input
model.eval()
print(f"Test:{model(x_test)}") # should be [[>0.5],[<0.5]]
我預計權重和偏差分別為 0.5555 和 -17.7777,但兩者都在不斷增加。根據這些預期值,S 形函數的 output 應該給出 1 或 0。這不正確嗎? 如何解決這個問題呢?
Sigmoid 既不能准確地得到 1,也不能准確地得到 0。 對於大輸入,它越來越接近 1,這可能就是為什么你的權重不斷增加和增加的原因。 但是,它永遠不會達到 1。要解決此問題,請移除 sigmoid 層或在 sigmoid 層之后添加線性層。
為了靜態構建你的分類器,你實際上可能想使用 heaviside function 作為激活 function: https://en.wikipedia.org/wiki/Heaviside_step_function 。 但是,由於此 function 的梯度始終為零,因此您無法訓練分類器。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.