声明:本博客是依托B站【刘二大人】的讲解视频并结合个人实践学习总结而成,仅用作记录本人学习巩固,请勿做商用。
上一讲中我们辨析了AI、经典机器学习、表示学习、深度学习的基本框架以及神经网络的发展历史。从这一讲开始进行实战。`
在深度学习中,我们通常需要四个步骤。
其中的数据集我们通常会分为训练集、验证集、测试集三个部分。
线性模型,从初等数学的角度上讲是很好理解的,简单说就是以一个一次函数去拟合所给数据集。权重如何选取才能达到较好的拟合效果即寻找最优权重是在训练时需要解决的问题。
这一讲中,我们选用穷举法进行手动训练(抛砖引玉嘛~)
对于拟合效果的优劣,我们利用Mean Square Error 的大小进行量化,其数学定义如下图:
对于给定的三个二维坐标数据,我们利用上述方法进行拟合并找出最优权重。
import numpy as np
import matplotlib.pyplot as plt
x_data = [1.0, 2.0, 3.0]
y_data = [2.0, 4.0, 6.0]
def forward(x): #预测值计算
return x * w
def loss(x, y): #MSE计算(其实并没有求平均)
y_pred = forward(x)
return (y_pred - y) ** 2
# 穷举法
w_list = []
mse_list = []
for w in np.arange(0.0, 4.1, 0.1):
print("w=", w)
l_sum = 0
for x_val, y_val in zip(x_data, y_data):
y_pred_val = forward(x_val)
loss_val = loss(x_val, y_val)
l_sum += loss_val
print('\t', x_val, y_val, y_pred_val, loss_val)
print('MSE=', l_sum / 3)
w_list.append(w)
mse_list.append(l_sum / 3)
plt.plot(w_list, mse_list)
plt.ylabel('Loss')
plt.xlabel('w')
plt.show()
运行结果如下:
通过matplotlib.pyplot中的plot函数我们可以将结果可视化,能够直观的得出结论但权重w=2时拟合效果最好。
这个函数用文字表述挺拗口的,但看个例子就明白了:
import numpy as np
a=[1,2,3]
b=[4,5,6]
c=[7,8,9]
zz=zip(a,b,c)
print(zz)
x,y,z=zip(*zz)
print(x)
print(y)
print(z)
输出:
[(1, 4, 7), (2, 5, 8), (3, 6, 9)]
(1, 2, 3)
(4, 5, 6)
(7, 8, 9)
其中,zip(*[iterable, …] )是zip( )的逆过程。
注意:对于所给元组索引长度不一致的情况,只返回各个元组的共有长度部分。
对于本例我们选用了plot函数绘图进行结果可视化(不多赘述)。对于数据集较大的深度学习过程,往往需要很长的训练时间,我们需要在训练的过程中进行可视化。究其原因,其一是对训练过程进行实时监听(如损失值loss,正确率acc等),其二是若发生由一些不可抗因素导致的程序崩溃的情况我们不至于一无所获。
这里介绍一个可视化工具Visdom:
Visdom是FaceBook开发的一款可视化工具,其实质是一款在网页端的web服务器,对Pytorch的支持较好。(虽然在Pytorch中,也有类似的TensorboardX,但其在张量数据加载的效率方面不如Visdom,而且你看它这个前缀哈,懂得都懂……)
相关库导入
from visdom import Visdom
import numpy as np
import time
终端开启监听命令:
python -m visdom.server
进行到这一步一切顺利:
然后就弹了一个防火墙,即便点允许访问也还是不能下载外网的东西。
然后就遇到了遇到了如下报错:
Traceback (most recent call last):
File "D:\anconda\lib\runpy.py", line 194, in _run_module_as_main
return _run_code(code, main_globals, None,
File "D:\anconda\lib\runpy.py", line 87, in _run_code
exec(code, run_globals)
File "D:\anconda\lib\site-packages\visdom\server.py", line 1922, in <module>
download_scripts_and_run()
File "D:\anconda\lib\site-packages\visdom\server.py", line 1918, in download_scripts_and_run
main()
File "D:\anconda\lib\site-packages\visdom\server.py", line 1910, in main
start_server(port=FLAGS.port, hostname=FLAGS.hostname, base_url=base_url,
File "D:\anconda\lib\site-packages\visdom\server.py", line 1791, in start_server
app.listen(port, max_buffer_size=1024 ** 3)
File "D:\anconda\lib\site-packages\tornado\web.py", line 2116, in listen
server.listen(port, address)
File "D:\anconda\lib\site-packages\tornado\tcpserver.py", line 152, in listen
self.add_sockets(sockets)
File "D:\anconda\lib\site-packages\tornado\tcpserver.py", line 165, in add_sockets
self._handlers[sock.fileno()] = add_accept_handler(
File "D:\anconda\lib\site-packages\tornado\netutil.py", line 279, in add_accept_handler
io_loop.add_handler(sock, accept_handler, IOLoop.READ)
File "D:\anconda\lib\site-packages\tornado\platform\asyncio.py", line 100, in add_handler
self.asyncio_loop.add_reader(fd, self._handle_events, fd, IOLoop.READ)
File "D:\anconda\lib\asyncio\events.py", line 501, in add_reader
raise NotImplementedError
NotImplementedError
解决办法传送门(真的好大一个坑疯狂报错!!!这个解决了但有些组件不能用,反正七七七八八一堆错误,有时间再修复它吧,累了)
各位csdn的大佬简直活菩萨,终于解决了(但日更梦想破灭了)!
Visdom可视化神经网络的训练过程大致分为3步:
举个小栗子:
# 实例化一个窗口
wind = Visdom()
# 初始化窗口信息
wind.line([0.], # Y的第一个点的坐标
[0.], # X的第一个点的坐标
win = 'train_loss', # 窗口的名称
opts = dict(title = 'train_loss') # 图像的标例
)
# 更新数据
for step in range(10):
# 随机获取loss,这里只是模拟实现
loss = np.random.randn() * 0.5 + 2
wind.line([loss],[step],win = 'train_loss',update = 'append')
time.sleep(0.5)
【刘二大人】提到了要使用np库中的meshgrid()函数,其作用简单来说就是生成绘制3D图形所需的网格数据。与其配套使用的是Axes3D( )函数,它是mpl_toolkits.mplot3d中的一个绘图函数,mpl_toolkits.mplot3d是Matplotlib里面专门用来画三维图的工具包。
作业代码如下:
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
x_data = [1.0,2.0,3.0]
y_data = [4.0,6.0,8.0] #随便给个一次函数
def forward(x):
return x * w + b
def loss(x,y):
y_pred = forward(x)
return (y_pred-y)*(y_pred-y)
mse_list = []
W=np.arange(0.0,4.1,0.1)
B=np.arange(0.0,4.1,0.1)
[w,b]=np.meshgrid(W,B)#这里对Z轴是没有限制的
l_sum = 0
for x_val, y_val in zip(x_data, y_data):
y_pred_val = forward(x_val)
print(y_pred_val)
loss_val = loss(x_val, y_val)
l_sum += loss_val
fig = plt.figure()#创建自定义图像
ax = Axes3D(fig)#绘制3D图
ax.plot_surface(w, b, l_sum/3,rstride=1,cstride=1)
ax.contourf(w, b, l_sum/3,zdir='mse',offset=-2)#这些参数可以自己按照喜好设置
plt.show()
实现日更失败(最近要考试了,PS:主页免费下载**《数字信号处理笔记》**),还会开个新坑,敬请期待!