Loading... ### Demo > #### 数据生成 ```python def calculate_fee(distance_travelled): return 10 + 2 * distance_travelled # calculate_fee(1.0) >>> 12.0 ``` ```python x_data = paddle.to_tensor([[1.0], [3.0], [5.0], [9.0], [10.0], [20.0]]) y_data = paddle.to_tensor([[12.0], [16.0], [20.0], [28.0], [30.0], [50.0]]) ``` > #### 获取权重和偏置 转换为NumPy数组,然后使用`item()`方法将其转换为标量 ```python linear = paddle.nn.Linear(in_features=1, out_features=1) w_before_opt = linear.weight.numpy().item() b_before_opt = linear.bias.numpy().item() print(w_before_opt, b_before_opt) # >>> 1.2818819284439087 0.0 ``` > #### 完整代码 ```python import paddle x_data = paddle.to_tensor([[1.0], [3.0], [5.0], [9.0], [10.0], [20.0]]) y_data = paddle.to_tensor([[12.0], [16.0], [20.0], [28.0], [30.0], [50.0]]) linear = paddle.nn.Linear(in_features=1, out_features=1) w_before_opt = linear.weight.numpy().item() b_before_opt = linear.bias.numpy().item() print(w_before_opt, b_before_opt) # >>> 1.2818819284439087 0.0 ``` ### 训练 > #### 计算损失 ```python mse_loss = paddle.nn.MSELoss() ``` > #### 初始化一个SGD(Stochastic Gradient Descent,随机梯度下降)是一种用于训练模型的优化算法。它通过不断地更新模型参数来最小化损失函数。 ```python sgd_optimizer = paddle.optimizer.SGD(learning_rate=0.001, parameters=linear.parameters()) ``` `learning_rate`参数是SGD算法中的一个超参数,用于控制每一步参数更新的步长大小。具体来说,`learning_rate`参数是用来乘以梯度的值,以计算参数更新的大小。如果`learning_rate`值较小,则参数更新的步长也会较小,训练过程可能需要更长的时间才能收敛;如果`learning_rate`值较大,则参数更新的步长也会较大,训练过程可能会出现震荡或者无法收敛的情况。 因此,在使用SGD算法时,需要根据具体情况来选择合适的`learning_rate`值,以达到更好的训练效果。 > #### 训练五万次 ```python total_epoch = 50000 for i in range(total_epoch): y_predict = linear(x_data) loss = mse_loss(y_predict, y_data) loss.backward() sgd_optimizer.step() sgd_optimizer.clear_gradients() if i % 1000 == 0: print(i, loss.numpy()) # >>> # >>>0 [166.97319] # >>>1000 [8.274545] # >>>2000 [1.8501314] # >>>3000 [0.41367328] # >>>4000 [0.09249252] # >>>5000 [0.02068028] # >>>6000 .... # >>>.... # >>>49000 [1.5586754e-07] ``` > #### 重新打印标量 ```python print(linear.weight.numpy().item(), linear.bias.numpy().item()) # >>> 2.0000507831573486 9.999356269836426 ``` > 可以看到结果几乎贴近2和10 > #### 完整代码 ```python import paddle def calculate_fee(distance_travelled): return 10 + 2 * distance_travelled x_data = paddle.to_tensor([[1.0], [3.0], [5.0], [9.0], [10.0], [20.0]]) y_data = paddle.to_tensor([[12.0], [16.0], [20.0], [28.0], [30.0], [50.0]]) linear = paddle.nn.Linear(in_features=1, out_features=1) w_before_opt = linear.weight.numpy().item() b_before_opt = linear.bias.numpy().item() print("初始:", w_before_opt, b_before_opt) mse_loss = paddle.nn.MSELoss() sgd_optimizer = 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 = mse_loss(y_predict, y_data) loss.backward() sgd_optimizer.step() sgd_optimizer.clear_gradients() if i % 1000 == 0: print(i, loss.numpy()) print(linear.weight.numpy().item(), linear.bias.numpy().item()) ``` 本文所有理解仅为个人学习当时状态下的理解 不代表百分百正确 最后修改:2023 年 03 月 18 日 © 允许规范转载 打赏 赞赏作者 微信 赞 3 如果觉得我的文章对你有用,请随意赞赏