簡體   English   中英

無法按 output.(celcius-fahrenheit) 對公式的輸入進行分類

[英]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-0positive 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.

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