木槿花篱

嘻嘻,欢迎~

第一次作业:深度学习基础

 

视频学习

之前已经看过了相关的视频,这次再看一遍,把一些重要的知识点再回顾一下。

  1. 机器学习是从数据中自动提取知识,有数据,有意义,没有解析解。机器学习三要素:

    • 模型:对要学习问题的映射。

      • 数据标记(监督学习、无监督学习、半监督学习、强化学习)

      • 数据分布(参数模型,非参数模型)

      • 建模对象(判别模型、生成模型)

    • 策略:从假设空间中学习、选择最优模型的准则(确定目标函数)

    • 算法:根据目标函数求解最优模型的具体计算方法(求解模型参数)

  2. 深度学习三个助推剂:数据、算法、计算力

  3. 深度学习的不能:

    • 算法输出不稳定,容易被攻击;

    • 模型复杂度高,难以纠错和调试;

    • 模型层级复合程度高,参数不透明;(卷积)

    • 端到端训练方式对数据依赖性强,模型增量性差;(拟合能力依赖于数据量)

    • 专注直观感知类问题,对开放性推理问题无能为力;

    • 人类知识无法有效引入进行监督,机器偏见难以避免。(数据不一定正确)

  4. 生物神经元到单层感知器,多层感知器

    • 生物神经元 多输入单输出的信息处理单元;具有阈值特性;分为兴奋性和抑制性;具有空间整合和时间整合特性。

    • M-P神经元 具有多个输入,每个输入对应一个权值,这个权值需要预先设定,所以M-P神经元没有学习能力。每个神经元还有一个阈值和一个激活函数。

    • 单层感知器 单层感知器的结构与M-P神经元一致,但是单层感知器中的权值是可以通过学习来改变的,所以单层感知器是首个可以学习的人工神经网络。

    • 多层感知器 由于单层感知器并不能解决非线性问题,多层感知器由此而生。多层感知器是在一层单层感知器的基础,叠加一层单层感知器,从而解决非线性问题(例如异或问题)。

  5. 误差的反向传播:对参数进行更新,实现对神经网络的学习过程。网络建立之后,数据从输入层进入,经过隐含层的调整,最后得到一个输出,与实际的输出相比较,就会产生一个误差。

    img

  6. 激活函数:用来加入非线性因素的,提高神经网络对模型的表达能力,解决线性模型所不能解决的问题。假设一个示例神经网络中仅包含线性卷积和全连接运算,那么该网络仅能够表达线性映射,即便增加网络的深度也依旧还是线性映射,难以有效建模实际环境中非线性分布的数据。

  7. img

 

代码练习

图像处理基本练习

有个小问题:

 

 

 

 

 

这个问题我还在查。。

 

 

Image读出来的是PIL的类型,而skimage.io读出来的数据是numpy格式的

 

 

我在网上找到一个图像切割的实例 帮助理解。

 

分类问题线性模型

 1 learning_rate = 1e-3
 2 lambda_l2 = 1e-5
 3 
 4 # nn 包用来创建线性模型
 5 # 每一个线性模型都包含 weight 和 bias
 6 model = nn.Sequential(
 7     nn.Linear(D, H),
 8     nn.Linear(H, C)
 9 )
10 model.to(device) # 把模型放到GPU上
11 
12 # nn 包含多种不同的损失函数,这里使用的是交叉熵(cross entropy loss)损失函数
13 criterion = torch.nn.CrossEntropyLoss()
14 
15 # 这里使用 optim 包进行随机梯度下降(stochastic gradient descent)优化
16 optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate, weight_decay=lambda_l2)
17 
18 # 开始训练
19 for t in range(1000):
20     # 把数据输入模型,得到预测结果
21     y_pred = model(X)
22     # 计算损失和准确率
23     loss = criterion(y_pred, Y)
24     score, predicted = torch.max(y_pred, 1)
25     acc = (Y == predicted).sum().float() / len(Y)
26     print('[EPOCH]: %i, [LOSS]: %.6f, [ACCURACY]: %.3f' % (t, loss.item(), acc))
27     display.clear_output(wait=True)
28 
29     # 反向传播前把梯度置 0 
30     optimizer.zero_grad()
31     # 反向传播优化 
32     loss.backward()
33     # 更新全部参数
34     optimizer.step()

 

分类问题(添加了Relu函数)

 1 learning_rate = 1e-3
 2 lambda_l2 = 1e-5
 3 
 4 # 这里可以看到,和上面模型不同的是,在两层之间加入了一个 ReLU 激活函数
 5 model = nn.Sequential(
 6     nn.Linear(D, H),
 7     nn.ReLU(),
 8     nn.Linear(H, C)
 9 )
10 model.to(device)
11 
12 # 下面的代码和之前是完全一样的,这里不过多叙述
13 criterion = torch.nn.CrossEntropyLoss()
14 optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate, weight_decay=lambda_l2) # built-in L2
15 
16 # 训练模型,和之前的代码是完全一样的
17 for t in range(1000):
18     y_pred = model(X)
19     loss = criterion(y_pred, Y)
20     score, predicted = torch.max(y_pred, 1)
21     acc = ((Y == predicted).sum().float() / len(Y))
22     print("[EPOCH]: %i, [LOSS]: %.6f, [ACCURACY]: %.3f" % (t, loss.item(), acc))
23     display.clear_output(wait=True)
24     
25     # zero the gradients before running the backward pass.
26     optimizer.zero_grad()
27     # Backward pass to compute the gradient
28     loss.backward()
29     # Update params
30     optimizer.step()

 

 

回归问题结果

 

猫狗大战的代码,我运行了一下,按照老师说的把优化器换成Adam以后,效果的确有提高。尝试按照比赛的要求写输出,因为对python语言不是很熟悉,还存在一些问题。

 

本周除了完成以上深度学习的内容,还接着学习了吴恩达的机器学习课程,很多东西从基础讲起,很清晰。尤其是参数更新这一块,比以前了解得更深了。

 

posted @ 2020-07-25 13:24  木槿花篱  阅读(177)  评论(0编辑  收藏  举报