《PyTorch深度学习实践》-刘二大人 第三讲

#梯度下降法
from matplotlib import pyplot as plt

# prepare the training set
x_data = [1.0, 2.0, 3.0]
y_data = [2.0, 4.0, 6.0]

# initial guess of weight
w = 1.0

# define the model linear model y = w*x
def forward(x):
    return x * w

#define the cost function MSE(均方差)
def cost(xs, ys):
    cost = 0
    for x, y in zip(xs, ys):
        y_pred = forward(x)
        cost += (y_pred - y) ** 2
    return cost / len(xs)

# define the gradient function  gd
def gradient(xs, ys):
    grad = 0
    for x, y in zip(xs, ys):
        grad += 2 * x * (x * w - y)
    return grad / len(xs)

epoch_list = []
cost_list = []
print('Predict (before training)', 4, forward(4))
for epoch in range(100):
    cost_val = cost(x_data, y_data)
    grad_val = gradient(x_data, y_data)
    w -= 0.01 * grad_val
    print('Epoch:', epoch, 'w=', w, 'loss=', cost_val)
    epoch_list.append(epoch)
    cost_list.append(cost_val)

print('Predict (after training)', 4, forward(4))
plt.plot(epoch_list, cost_list)
plt.xlabel('Epoch')
plt.ylabel('cost')
plt.show()

 

 

 

#随机梯度下降法,代码中没有体现哪里随机,差评,在网上找了一下随机怎么加,加了一个随机
'''随机梯度下降法在神经网络中被证明是有效的。效率较低(时间复杂度较高),学习性能较好。
(梯度下降法计算时可以并行,所以效率好,但是容易进入鞍点;
随机梯度下降需要等待上一个值运行完才能更新下一个值,无法并行计算,但是某种程度上能解决鞍点问题;
因此,有种折中的办法叫batch。)

随机梯度下降法和梯度下降法的主要区别在于:
1、损失函数由cost()更改为loss()。cost是计算所有训练数据的损失,loss是计算一个训练函数的损失。对应于源代码则是少了两个for循环。
2、梯度函数gradient()由计算所有训练数据的梯度更改为计算一个训练数据的梯度。
'''
import random
import matplotlib.pyplot as plt

x_data = [1.0, 2.0, 3.0]
y_data = [2.0, 4.0, 6.0]

w = 1.0

def forward(x):
    return x * w

# calculate loss function
def loss(x, y):
    y_pred = forward(x)
    return (y_pred - y) ** 2

# define the gradient function  sgd(随机梯度下降)
def gradient(x, y):
    return 2 * x * (x * w - y)

epoch_list = []
loss_list = []
print('predict (before training)', 4, forward(4))
for epoch in range(100):
    #原代码
    # for x, y in zip(x_data, y_data):
    #     grad = gradient(x, y)
    #     w = w - 0.01 * grad  # update weight by every grad of sample of training set
    #     print("\tgrad:", x, y, grad)
    #     l = loss(x, y)
    # print("progress:", epoch, "w=", w, "loss=", l)
    #加随机
    rc = random.randrange(0,3)
    x1 = x_data[rc]
    y1 = y_data[rc]
    grad = gradient(x1, y1)
    w = w - 0.01 * grad
    l = loss(x1, y1)

    epoch_list.append(epoch)
    loss_list.append(l)

print('predict (after training)', 4, forward(4))
plt.plot(epoch_list, loss_list)
plt.ylabel('loss')
plt.xlabel('epoch')
plt.show()

 

 

posted @ 2022-10-19 19:22  silvan_happy  阅读(71)  评论(0编辑  收藏  举报