Python中如何用循环记录数据绘制散点图,可视化Perceptron训练轮次变化?
解决方法
完全可以通过在训练循环中记录每轮(或间隔轮次)的训练轮次与对应输出值,再用这些记录的数据绘制散点图,就能呈现Perceptron输出随训练推进的变化过程。
修改后的代码
import numpy as np from matplotlib import pyplot as plt def sigmoid(x): return 1 / (1 + np.exp(-x)) def sigmoid_d(x): return x * (1 - x) training_inputs = np.array([[0, 0, 1], [1, 1, 1], [1, 0, 1], [0, 1, 1]]) training_outputs = np.array([[1, 0, 1, 0]]).T np.random.seed(1) synaptic_weights = 2 * np.random.random((3, 1)) - 1 print("Random Starting Synaptic Weights: ") print(synaptic_weights) # 初始化列表存储训练轮次和四个样本的输出 epochs = [] outputs_history = [] # 每1000轮记录一次,避免10万轮数据过多导致图表拥挤 record_step = 1000 for i in range(100000): input_layer = training_inputs outputs = sigmoid(np.dot(input_layer, synaptic_weights)) error = training_outputs - outputs adjustments = error * sigmoid_d(outputs) synaptic_weights += np.dot(input_layer.T, adjustments) # 按间隔记录数据 if i % record_step == 0: epochs.append(i) outputs_history.append(outputs.flatten().tolist()) # 转成numpy数组方便按样本提取数据 outputs_history = np.array(outputs_history) # 绘制每个样本的输出变化 plt.figure(figsize=(10,6)) plt.scatter(epochs, outputs_history[:,0], c='blue', label='样本[0,0,1]', s=5) plt.scatter(epochs, outputs_history[:,1], c='orange', label='样本[1,1,1]', s=5) plt.scatter(epochs, outputs_history[:,2], c='green', label='样本[1,0,1]', s=5) plt.scatter(epochs, outputs_history[:,3], c='red', label='样本[0,1,1]', s=5) plt.xlabel('训练轮次(Epoch)') plt.ylabel('输出值') plt.title('Perceptron训练过程中输出的变化') plt.legend() plt.grid(alpha=0.3) print("Synaptic Weights after training: ") print(synaptic_weights) print("Post-Training Outputs: ") print(outputs) plt.show()
关键改动说明
- 新增
epochs和outputs_history两个列表,用来存储需要可视化的训练轮次和对应输出数据 - 设置
record_step=1000,只记录每1000轮的数据,避免10万轮全部记录导致图表过于密集、加载缓慢 - 在循环内按间隔把当前轮次和四个样本的输出存入列表
- 循环结束后把记录的输出转成numpy数组,方便按每个样本提取数据绘制散点图
- 给图表添加标签、标题、图例和网格,让结果更易读
这样你就能清楚看到每个样本的输出是如何随着训练轮次增加逐渐接近目标值的。
内容的提问来源于stack exchange,提问作者AtomicUnleashed
相关产品推荐
相关产品推荐

