1、动态曲线图画图原理
这里假设我们使用python的matplotlib工具包进行画图操作,其大致原理如下: a)、开始工作前,我们需要一个画板 。 b)、光有画板还是不能够画图的,得需要有画布 fig(总不能画在画板上吧)。 c)、光有画布fig也不行,得知道在画布上的哪个区域 进行绘画操作,为此我们需要获取可作图区域ax 。 d)、在可作图区域上进行一个简单的绘图 操作。 e)、在一个特定的时间t后将原先作图区域上的绘图擦除 。 f)、在原先的作图区域上再绘制 步骤d)中所绘制的图像。 g)、重复上述操作。
上述步骤可用以下简单代码进行表示:
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
x = []
y = []
for i in range(200):
x.append(i)
y.append(i**2)
ax.cla()
ax.plot(x, y)
plt.xlabel('x')
plt.ylabel('y')
plt.pause(0.1)
具体效果如下图所示:
2、在机器学习中引入动态曲线图
在深度学习中引入动态曲线图,可将横轴x看作训练次数,纵轴y看作损失loss。这里我引用之前所写文章机器学习之流浪地球中的学习一个简单模型
y
=
2
x
y=2x
y=2x的梯度下降训练算法:
import random
import matplotlib.pyplot as plt
def model(w, x):
return w*x
def loss(w, x, y):
y_hat = model(w, x)
return (y_hat - y)**2 / 2
def gradient(w, x, y):
return x*(w*x - y)
def SGD(x, y, lr, w):
sc_index = random.randint(0, len(x) - 1)
print("sc_index:", sc_index)
x_i, y_i = x[sc_index], y[sc_index]
grad = gradient(w, x_i, y_i)
w = w - lr*grad
return sc_index, w
fig, ax = plt.subplots()
def train(num_epochs, x, y, w, lr):
epoch_list = []
loss_list = []
for epoch in range(num_epochs):
sc_index, w = SGD(x_data, y_data, lr, w)
l = loss(w, x[sc_index], y[sc_index])
epoch_list.append(epoch + 1)
loss_list.append(l)
print(f'epoch:{epoch+1} loss={l:.6f} w={w:.3f}')
ax.cla()
ax.plot(epoch_list, loss_list)
plt.xlabel("epoch")
plt.ylabel("loss")
plt.pause(0.1)
return w
x_data = [1.0, 2.0, 3.0]
y_data = [2.0, 4.0, 6.0]
w_0 = random.uniform(0, 1)
num_epochs, lr = 50, 0.1
w_final = train(num_epochs, x_data, y_data, w_0, lr)
def prediction(w, year):
return w*(year - 2019 + 1)
print(f'2072年时观看过《流浪地球》的人数将达到{prediction(w_final, 2072):.1f}千万人')
|