实战 二分分类器(python + pytorch)

    科技2026-02-11  17

    什么是二分分类  

    二分类问题就是简单的“是否”、“有无”等只有两种结果的问题,如分类器只能输出0和1。

    二分分类问题:假如有一副下图中含有两只小猫的图片,人和机器分别怎么判断图片中是否有猫存在?

    在二分分类中的问题中,我们的目标是训练出一个分类器(classifier)它以特征向量x作为输入预测出结果y是0还是1,也就是预测出图片中是否含有猫。

    在我们自然人看来,一眼便能看出图片中存在两只猫,因为我们人类本身就是一个高级的智能系统。 可是对于计算机来说,他可能没有那么智能,计算机能处理的只是数据,所以我们要用办法把含有猫的图片转化成计算机能够处理的数据。

    对于图片,计算机可以用表示亮度值的64X64的Red,green,blue三个矩阵来存储,把矩阵值放到一起组成一个非常长的特征向量x(feature vector)。向量的维度(dimension)是64X64X3=12288,用n或者nx表示。所以特征向量X表示这个图片。

    下面我们便一起来使用python做一个简单的二分分类器吧

    实战演练

    目的:随机生成一些数据,使用二分分类去进行分类

    运行代码如下

    import numpy as np import matplotlib.pyplot as plt import torch.nn as nn import torch import torch.utils.data as d import torch.nn.functional as func #每组训练样本数 总共样本数应为2N N = 2222 #class 1 x_c1 = np.random.randn(N, 2) # 利用标准正态分布创建N行2列的矩阵 x_c1 = np.add(x_c1, [9, 9]) #加数据以便于区分 y_c1 = np.ones((N, 1), dtype=np.double) #class 2 x_c2 = np.random.randn(N, 2) # 利用标准正态分布创建N行2列的矩阵 x_c2 = np.add(x_c2, [2, 5]) y_c2 = np.zeros((N, 1), dtype=np.double) # 生成数据 # concatenate((x1,x2),axis)为拼接函数 x1,x2为拼接的向量 axis=0行拼接 axis=1列拼接 data_x = np.concatenate((x_c1, x_c2), 0) data_y = np.concatenate((y_c1, y_c2), 0) #转为tensor向量 # tensor_x=data, tensor_y=label tensor_x = torch.tensor(data_x, dtype=torch.float) tensor_y = torch.tensor(data_y, dtype=torch.float) data_set = d.TensorDataset(tensor_x, tensor_y) # shuffle:是否打乱顺序 loader = d.DataLoader( dataset=data_set, batch_size=10, shuffle=True ) class Net(nn.Module): def __init__(self): super(Net, self).__init__() self.hidden = nn.Linear(2, 1) def forward(self, x): return torch.sigmoid(self.hidden(x)) def line(w, b, x): return (1 / w[0][1]) * (- w[0][0] * x - b[0]) net1 = Net() print(net1) # net2 = torch.nn.Sequential( # nn.Linear(2, 1), # nn.Sigmoid() # ) # print(net2) optimizer = torch.optim.Adam(net1.parameters(), lr=0.1) loss_func = torch.nn.MSELoss() loss_list = [] # training ... for epoch in range(10): for step, (batch_x, batch_y) in enumerate(loader): prediction = net1(batch_x) loss = loss_func(prediction, batch_y) loss_list.append(loss.data.tolist()) optimizer.zero_grad() loss.backward() optimizer.step() md = net1.state_dict() print(md) W_tensor = md['hidden.weight'] b_tensor = md['hidden.bias'] W_np = W_tensor.numpy() b_np = b_tensor.numpy() X = np.linspace(0, 10, 1000) x1 = x_c1[:, 0].T y1 = x_c1[:, 1].T x2 = x_c2[:, 0].T y2 = x_c2[:, 1].T plt.subplot(1, 2, 1) plt.plot(x1, y1, "bo", markersize=2, label='class1') plt.plot(x2, y2, "ro", markersize=2, label='class2') plt.plot(X, line(W_np, b_np, X), linestyle="-", color="black", label='sorting_line') plt.legend(loc="best") plt.xlim(-1, 14) plt.ylim(-1, 14) plt.subplot(1, 2, 2) plt.plot(loss_list, linestyle="-", color="black", label='error_line') plt.legend(loc="best") plt.show()

    运行结果如下

    Processed: 0.009, SQL: 9