「深い学習Pytorch入門」を参照してください
バイナリ分類を実現するロジスティック回帰
データダウンロードリンク:データ(抽出コード:q8gd)
1.まず、データを読み取るdata.txtを
#logistic回归
#读取data.txt
import matplotlib.pyplot as plt
with open('data.txt','r') as f:
data_list = f.readlines()
data_list = [i.split('\n')[0] for i in data_list]
data_list = [i.split(',') for i in data_list]
data = [(float(i[0]),float(i[1]),float(i[2])) for i in data_list]
#q前两个数据表示X,Y坐标,最后一个数据表示类别
最初の2つは、水平および垂直座標データdata.txtを開いている、最後のカテゴリは0.1でした。このデータは、二つのプロパティのカテゴリがあります。次に描か異なるカテゴリに従ってデータ。
x0 = list(filter(lambda x: x[-1]==0.,data)) #filter去除不符合条件的,保留符合条件的数据
x1 = list(filter(lambda x: x[-1]==1.,data))#数据按类别筛选
plot_x0_x = [i[0] for i in x0]
plot_x0_y = [i[1] for i in x0]
plot_x1_x = [i[0] for i in x1]
plot_x1_y = [i[1] for i in x1]
plt.plot(plot_x0_x,plot_x0_y,'ro',label='x_0')
plt.plot(plot_x1_x,plot_x1_y,'gx',label='x_1')
plt.legend(loc='best')
Pytorchの操作対象は、このタイプのデータは、テンソルを変換する、テンソルです。
import torch
import numpy as np
from torch import nn
# #转换数据
np_data = np.array(data, dtype='float32') # 转换成 numpy array
x_data = torch.from_numpy(np_data[:, 0:2]) # 转换成 Tensor, 大小是 [100, 2]
y_data = torch.from_numpy(np_data[:, -1]).unsqueeze(1) # 转换成 Tensor,大小是 [100, 1]
分類モデルを構築する2
class LR(nn.Module):
def __init__(self):
super(LR,self).__init__()
self.lr = nn.Linear(2,1) #输入两个属性输出一个类别
self.sm = nn.Sigmoid() #Sigmoid激活函数就是Logistic回归的精髓
def forward(self,x):
x = self.lr(x)
x = self.sm(x)
return x
LR_model = LR()
if torch.cuda.is_available():
LR_model.cuda()
criterion = nn.BCELoss() #BCE是二分类损失函数 交叉熵
optimizer = torch.optim.SGD(LR_model.parameters(),lr=1e-3,momentum=0.9)
サポートCUDAは、メイクモデルとデータがCUDA上で実行されている場合3.トレーニングモデル、.cudaで()に結合することができます。
for epoch in range(18000):
if torch.cuda.is_available():
x = x_data.cuda()
y = y_data.cuda()
else:
x = x_data
y = y_data
#===========forward==================#
out = LR_model(x)
loss = criterion(out,y)
mask = out.ge(0.5).float() #把输出结果大于0.5的归于1,小于归成0
correct = (mask==y).sum()
acc = correct.item()/x.size(0)
#===========backward==================#
optimizer.zero_grad()
loss.backward()
optimizer.step()
if (epoch+1)%1000== 0: #每迭代一千次,看一下当前loss,acc
print('*'*10)
print('epoch:{},loss is:{},acc is:{}'.format(epoch,loss.item(),acc))
結果は以下の通りであります:
図中の境界データを描画4。
#画出分界线
w0,w1 = LR_model.lr.weight[0]
w0 = w0.item() #tensor是标量可以用item直接转换
w1 = w1.item()
b = LR_model.lr.bias[0]
b = b.item()
plot_x = np.arange(30,100,0.1)#从之前的图大致看出x轴范围
plot_y = (-w0*plot_x-b)/w1 #w1y+w0 x+b=0直线
plt.plot(plot_x0_x,plot_x0_y,'ro',label='x_0')
plt.plot(plot_x1_x,plot_x1_y,'gx',label='x_1')
plt.legend(loc='best')
plt.plot(plot_x,plot_y)
問題のPytorchバージョン、元の本コードは、Baiduはをクリックし、エラーの多くを有することができます。