本文用简单的神经网络做数据分类,展示神经网络训练过程,方便理解
神经网络模型: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()
第二步:合并数据并将数据打乱,然后将数据转换为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()