j9九游会float(i[1])-九游娱乐(中国)网址在线
本文重心
前边咱们学习了线性总结模子的搭建,不管是基于pytorch已经不基于pytorch,以上的模子都是总结模子,本文咱们将使用pytorch搭建逻辑总结模子,逻辑总结模子是一个经典的分类问题。
模子搭建
class LogisticRegression(nn.Module) : def __init__(self) : super (LogisticRegression, self). __init__() self.lr=nn.Linear(2,1) self.sm=nn.Sigmoid() def forward(self,x): x=self.lr(x) x=self.sm(x) return x
这里咱们使用pytorch搭建了一个逻辑总结的算法模子,其中输入层神经元2个,输出层神经元1个,然后后头接一个sigmoid激活函数,它的模子结构为:
数据解决
咫尺咱们有一个文本文献数据集,它是一个文本文献,它内部的执行轨范为:
前边两个咱们不错觉得它是特征x1,x2,终末一个是标签,二分类问题,标签值为0省略1,它们之间通过逗号离隔,底下咱们需要解决它们,需要读取文献,然后将其封装为特征x和标签y,然后才不错放到蚁合模子中进行锻练。
with open('data','r') as f: data_list=f.readlines()#读取所有复返一个列表,txt每一瞥示意一个举座 data_list=[i.split('\n')[0] for i in data_list]#去掉每一瞥之后的\n data_list=[i.split(',') for i in data_list] #print(data_list)#[[x1,x2,y],[],[]...[]] data=[] #过滤掉缺失的数据 for i in data_list : if len(i)!=1: data.append(i) data=[(float(i[0]),float(i[1]),float(i[2])) for i in data] x_data=[[i[0]j9九游会,i[1]] for i in data]y_data=[[i[2]] for i in data]x_data=np.array(x_data)x_data=torch.from_numpy(x_data)x_data=x_data.float()y_data=np.array(y_data)y_data=torch.from_numpy(y_data)y_data=y_data.float()
如代码所示,咱们讲数据从文本文献读取出来,然后将其解决成样本特征和样本标签,之后咱们就不错将其放到神经采聚首进行锻练了。
锻练逻辑总结模子
logistic_model = LogisticRegression() if torch.cuda.is_available() : logistic_model.cuda() criterion = nn.BCELoss () optimizer = torch.optim.SGD(logistic_model.parameters() , lr=1e-3)for epoch in range(100000): if torch.cuda.is_available() : x=x_data.cuda() y=y_data.cuda() else: x = x_data y = y_data out = logistic_model(x) loss= criterion(out, y) print_loss = loss.item() mask=out.ge(0.5).float() correct=(mask == y).sum () acc = correct.item()/x.size(0) optimizer.zero_grad() loss.backward () optimizer.step () if (epoch+1) 00==0: print('*'*10) print('epoch {}' . format (epoch+1)) print ('loss is {:.4f}'.format(print_loss)) print ( 'acc i8 {:.4f} '. format (acc) )
如代码所示,咱们不错看到咱们将数据放到了逻辑总结模子中,然后驱动锻练,这里除了联想逝世以外,还联想了准确度,具体来说便是底下的这几行代码:
mask=out.ge(0.5).float() correct=(mask == y).sum ()
这个示意out惟有大于0.5那么mask值为1,若是小于0.5那么mask值为0,咱们看一下推测的mask和y之间的特别的数目,这个便是正确推测的样本的个数,正确样本的个数/总样本的个数便是准确率
可视化
锻练的模子的后果是什么样的,咱们不错对锻练截止可视化,因为模子锻练便是锻练一条线来分割正负样本,咱们只需要将样本可视化,然后将锻练模子的参数取出来,将其可视化,那么咱们就不错看到这个模子的锻练后果了。
#可视化原始数据x0=list(filter(lambda x :x[-1]==0.0,data))x1=list(filter(lambda x :x[-1]==1.0,data))plot_x0_0=[i[0] for i in x0]plot_x0_1=[i[1] for i in x0]plot_x1_0=[i[0] for i in x1]plot_x1_1=[i[1] for i in x1]plt.plot(plot_x0_0,plot_x0_1,'ro',label='x_0')plt.plot(plot_x1_0,plot_x1_1,'bo',label='x_1')plt.legend(loc='best')#获得模子的参数w0,w1 = logistic_model.lr.weight.data[0]w0 = w0.item()w1 = w1.item()b = logistic_model.lr.bias.data[0] #可视化锻练的模子,其实便是一条直线plot_x = np.arange(30, 100, 0.1) plot_x=torch.from_numpy(plot_x)plot_x=plot_x.float()plot_y=(-w0*plot_x-b)/w1plot_x=plot_x.numpy()plot_y=plot_y.numpy()plt.plot(plot_x, plot_y) plt.show()
一皆代码
import torchimport numpy as npimport torch.nn as nnimport torch.optim as optimimport matplotlib.pyplot as pltwith open('data','r') as f: data_list=f.readlines()#读取所有复返一个列表,txt每一瞥示意一个举座 data_list=[i.split('\n')[0] for i in data_list]#去掉每一瞥之后的\n data_list=[i.split(',') for i in data_list] #print(data_list)#[[x1,x2,y],[],[]...[]] data=[] #过滤掉缺失的数据 for i in data_list : if len(i)!=1: data.append(i) data=[(float(i[0]),float(i[1]),float(i[2])) for i in data] x_data=[[i[0],i[1]] for i in data]y_data=[[i[2]] for i in data]x_data=np.array(x_data)x_data=torch.from_numpy(x_data)x_data=x_data.float()y_data=np.array(y_data)y_data=torch.from_numpy(y_data)y_data=y_data.float()class LogisticRegression(nn.Module) : def __init__(self) : super (LogisticRegression, self). __init__() self.lr=nn.Linear(2,1) self.sm=nn.Sigmoid() def forward(self,x): x=self.lr(x) x=self.sm(x) return x logistic_model = LogisticRegression() if torch.cuda.is_available() : logistic_model.cuda() criterion = nn.BCELoss () optimizer = torch.optim.SGD(logistic_model.parameters() , lr=1e-3)for epoch in range(100000): if torch.cuda.is_available() : x=x_data.cuda() y=y_data.cuda() else: x = x_data y = y_data out = logistic_model(x) loss= criterion(out, y) print_loss = loss.item() mask=out.ge(0.5).float() correct=(mask == y).sum () acc = correct.item()/x.size(0) optimizer.zero_grad() loss.backward () optimizer.step () if (epoch+1) 00==0: print('*'*10) print('epoch {}' . format (epoch+1)) print ('loss is {:.4f}'.format(print_loss)) print ( 'acc i8 {:.4f} '. format (acc) ) x0=list(filter(lambda x :x[-1]==0.0,data))x1=list(filter(lambda x :x[-1]==1.0,data))plot_x0_0=[i[0] for i in x0]plot_x0_1=[i[1] for i in x0]plot_x1_0=[i[0] for i in x1]plot_x1_1=[i[1] for i in x1]plt.plot(plot_x0_0,plot_x0_1,'ro',label='x_0')plt.plot(plot_x1_0,plot_x1_1,'bo',label='x_1')plt.legend(loc='best')w0,w1 = logistic_model.lr.weight.data[0]w0 = w0.item()w1 = w1.item()b = logistic_model.lr.bias.data[0] plot_x = np.arange(30, 100, 0.1) plot_x=torch.from_numpy(plot_x)plot_x=plot_x.float()plot_y=(-w0*plot_x-b)/w1plot_x=plot_x.numpy()plot_y=plot_y.numpy()plt.plot(plot_x, plot_y) plt.show()