这里知识引入了梯度下降的公式 以及可视化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()