输出的结果为fail和pass时,称为2分类。
将函数值映射到[0,1]之间,这样才能符合分类问题。
这是损失函数。
由于结果值只有1和0.当正确值为1时:y'越接近1,logy'越小,损失越小。
当正确值为0:y'越接近0,logy'也越小,损失越小。
老师的图有点误导,实际上是这样的。
这个.data.numpy是啥?为什么搜不到啊?
from ast import Return
from operator import itemgetter
from pickletools import optimize
import numpy.matlib
import torch
import numpy as np
import matplotlib.pyplot as plt
x_data=torch.tensor([[1.0],[2.0],[3.0]])
y_data=torch.tensor([[0],[0],[1]])#分类问题--结果为0或1(概率问题)
class Logistic(torch.nn.Module):
def __init__(self):
super(Logistic,self).__init__()
self.linear=torch.nn.Linear(1,1)
def forward(self,x):
y_pred=torch.sigmoid(self.linear(x))
return y_pred
model=Logistic()
sunshi=torch.nn.BCELoss(size_average=False)#不求均值会影响学习率选取
youhua=torch.optim.SGD(model.parameters(),lr=0.01)
e_l=[]
loss_l=[]
y_data=y_data.to(torch.float32)#这里做了强制转换
for epoch in range(1000):
y_pred=model(x_data)
loss=sunshi(y_pred,y_data)#这里出现一个报错,y_data必须是float
print(epoch,loss.item())
loss_l.append(loss.item())
youhua.zero_grad()
loss.backward()
youhua.step()
e_l.append(epoch)
plt.plot(e_l,loss_l)
plt.xlabel("epoch")
plt.ylabel("loss")
plt.show()
代码说明:
1、视频中代码F.sigmoid(self.linear(x))会引发warning,此处更改为torch.sigmoid(self.linear(x))
另外一段不打算打了,是来画出损失函数的图像。