用最简单的神经网络做数据分类,展示神经网络训练过程

本文用简单的神经网络做数据分类,展示神经网络训练过程,方便理解
神经网络模型:Y = w1x1 + w2x2 + b
第一步:生成训练数据与标签

import paddle
import numpy as np
import matplotlib.pyplot as plt

print(paddle.__version__)

#生成训练数据与标签
x1 = np.random.normal(6, 1, size=(100))
x2 = np.random.normal(3, 1, size=(100))
y = np.ones(100) #  label:1
class1 = np.array([x1, x2, y]).T
y = np.zeros(100) # label:0
class2 = np.array([x2, x1, y]).T
print(class1.shape, class2.shape)
#查看数据集
plt.scatter(class1[:, 0], class1[:, 1], c='r')
plt.scatter(class2[:, 0], class2[:, 1], c='b', marker='*')
plt.show()
用最简单的神经网络做数据分类,展示神经网络训练过程_第1张图片
生成的数据

第二步:合并数据并将数据打乱,然后将数据转换为Paddle框架所需要的数据类型

#合并数据并将数据打乱
all_data = np.concatenate((class1, class2))
np.random.shuffle(all_data)
#获取训练数据和标签
train_data_x = all_data[:,:2]
train_data_y = all_data[:, -1].reshape(-1, 1)
#转换为Paddle框架所需要的数据类型
x_data = paddle.to_tensor(train_data_x.astype('float32'))
y_data = paddle.to_tensor(train_data_y.astype('float32'))

第三步,基于Paddle,构建神经网络、定义损失函数和优化器:Y = w1x1 + w2x2 + b

#构建线性网络:y = w1*x1 + w2*x2 + b
linear = paddle.nn.Linear(in_features=2, out_features=1)
#定义MSE损失函数
mse_loss = paddle.nn.MSELoss()
#定义优化器
optim = paddle.optimizer.SGD(learning_rate=0.001, parameters=linear.parameters())

第四步,构建训练过程

# 定义训练轮次
total_epoch = 50000
#构建训练过程
for i in range(total_epoch):
    #计算预测值
    y_predict = linear(x_data)
    #计算loss
    loss = mse_loss(y_predict, y_data)
    #反向传播
    loss.backward()
    #执行优化算法
    optim.step()
    #梯度清零
    optim.clear_grad()
    #获取模型中的w1
    w1_after_opt = linear.weight.numpy()[0].item()
    #获取模型中的w2
    w2_after_opt = linear.weight.numpy()[1].item()
    #获取模型中的b
    b_after_opt = linear.bias.numpy().item()
    #每1000次输出一次数据
    if i % 1000 == 0:
        print("epoch {} loss {}".format(i, loss.numpy()))
        print("w1 after optimize: {}".format(w1_after_opt))
        print("w2 after optimize: {}".format(w2_after_opt))
        print("b after optimize: {}".format(b_after_opt))
print("finished training, loss {}".format(loss.numpy()))

epoch 49000 loss [0.04740278]
w1 after optimize: 0.14253002405166626
w2 after optimize: -0.13017894327640533
b after optimize: 0.4423215091228485
finished training, loss [0.04739621]

最后一步,绘制训练结果

#绘制结果
plt.scatter(class1[:, 0], class1[:, 1])
plt.scatter(class2[:, 0], class2[:, 1], marker='*')
x = np.arange(10)
#画线的公式
y = -(w1_after_opt * x) / w2_after_opt + b_after_opt
plt.plot(x, y)
plt.show()
用最简单的神经网络做数据分类,展示神经网络训练过程_第2张图片
训练结果

你可能感兴趣的:(用最简单的神经网络做数据分类,展示神经网络训练过程)