梯度下降

这里知识引入了梯度下降的公式 以及可视化loss 和epoch

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 w*x

# 为看每次迭代后的整体cost
def cost(x,y):
    cost = 0
    for xs,ys in zip(x,y):  
        y_pred = forward(xs)
        cost += (y_pred-ys)**2
    return cost / len(x)

#普通梯度下降 需要计算整体的梯度值(比较费时间,后面有SGD 随机梯度下降和mini-batch)
def gradient(x,y):
    grad = 0    #这里赋值为零放在外面
    for xs,ys in zip(x,y):  
#zip 函数是为了把x和y对应数值组成三对(1.0,2.0)(2.0,4.0)(3.0,6.0)运算
    #grad = 0为什么放在这里计算最后精度就会不用样呐??? 这儿没明白  
    # 想了想运算原理  放到里面 的话for 循环不再是累加三个数据的梯度了,只是最后一个的梯度 类似于sgd 了 但是return 又除了 lenx 所以不黑不白的 。 
        grad += 2 * xs * (w * xs - ys)
    return grad / len(x)


epoch_list = [] #构造这两个的目的是为了绘图得到可视化的图像
cost_list = [] 
print("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 = w - 0.01 * grad_val 
    if epoch %10 == 0:
        print("epoch:",epoch,'w',w,cost_val)
    epoch_list.append(epoch)
    cost_list.append(cost_val) 
print("after training:",4,forward(4))

plt.plot(epoch_list,cost_list)
plt.ylabel('Loss')
plt.xlabel('epoch')
plt.show()

下面随机梯度下降

#SGD
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 w*x

# 这儿只是为了看每次迭代后的整体cost
def loss(x,y):
    y_pred = forward(x)
    loss= (y_pred-y)**2
    #print("loss",loss)
    return loss


#随机梯度下降 只需要单个梯度值
def gradient(x,y):
    grad = 2 * x * (w * x - y)
    return grad


epoch_list = [] #构造这两个的目的是为了绘图得到可视化的图像
cost_list = [] 
print("before training:",4,forward(4))

for epoch in range(101):
    for x_val,y_val in zip(x_data,y_data):
        l = loss(x_val,y_val)
        grad_val = gradient(x_val,y_val) 
        w = w - 0.01 * grad_val  #每个循环就3次梯度下降
        print('\tgrad:',x_val,y_val,grad_val) #观察每一次的梯度变化
    if epoch %10 == 0:
        print("epoch:",epoch,'w',w,"Loss",l) #观察每一组数据过后loss
        
    print("progress:",epoch,"w=",w,"loss=",l)
    #一个epoch 后loss 也就是每次 三组数据循环完后的[3.0,6.0]对应loss
    
    epoch_list.append(epoch)
    cost_list.append(l) 
print("after training:",4,forward(4))


plt.plot(epoch_list,cost_list)
plt.ylabel('Loss')
plt.xlabel('epoch')
plt.show()
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Afterglow-F

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值