每天五分钟深度学习pytoroch:基于pytorch搭建逻辑归来算法模子
本文重心 前边咱们学习了线性归来模子的搭建,不管是基于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],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() |