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

什么是二分分类  

二分类问题就是简单的“是否”、“有无”等只有两种结果的问题,如分类器只能输出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()

运行结果如下

  • 7
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
PythonPyTorch是两个不同的东西。Python是一种高级编程语言,而PyTorch是一个基于Python的机器学习框架。PyTorch提供了丰富的工具和函数,用于构建和训练神经网络模型。 在引用\[1\]中的代码示例中,展示了一个简单的训练过程。首先,创建了一个模型对象,并生成了一个随机的向量和标签。然后,定义了一个损失函数和一个优化器。最后,使用优化器对模型进行训练。 在引用\[2\]中的代码示例中,展示了一个模型的前向传播过程。首先,定义了一个输入向量和一个嵌入层。然后,使用嵌入层将输入向量转换为嵌入向量。接下来,使用torch.einsum函数计算输出。最后,返回输出。 在引用\[3\]中的代码示例中,展示了一些与排序和填充相关的操作。首先,定义了一个张量a和一个长度向量lengths。然后,使用torch.sort函数对lengths进行排序,并获取排序后的长度和索引。接下来,根据索引对张量a进行排序。然后,定义了一个嵌入层和一个LSTM层,并将张量a输入到嵌入层中。接下来,使用pack_padded_sequence函数对输入进行填充。然后,使用LSTM层对填充后的输入进行处理。最后,使用pad_packed_sequence函数对输出进行填充,并根据索引对输出进行排序。 总之,Python是一种编程语言,而PyTorch是一个用于机器学习的框架。在PyTorch中,可以使用Python编写代码来构建和训练神经网络模型,并进行各种操作,如排序和填充。 #### 引用[.reference_title] - *1* *2* *3* [python+pytorch学习点滴记录](https://blog.csdn.net/benben044/article/details/123881062)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MacalDan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值