| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 人工智能 -> cs231n-2022-assignment2#Q1:多层全连接神经网络 -> 正文阅读 |
|
[人工智能]cs231n-2022-assignment2#Q1:多层全连接神经网络 |
目录 1. 前言????????本文是斯坦福cs231n-2022的第二次作业的第1个问题(Multi-Layer Fully Connected Neural Networks)。 第1个作业参见: ????????cs231n-2022-assignment1#Q5:Higher Level Representations: Image Features ????????课程内容参见:CS231n Convolutional Neural Networks for Visual Recognition ? ? ? ? 本作业的内容包括构建一个任意层次的全连接神经网络模型(其实就是DNN啦)及其训练,可以看作是assignment1#Q4:Two-Layer Neural Network,的一个自然扩充。 ????????作业的原始starter code可以从Assignment 1 (cs231n.github.io)下载。建议有兴趣的伙伴读原文,过于精彩,不敢搬运。本文可以作为补充阅读材料,主要介绍作业完成过程所涉及一些要点以及关键代码解读。修改的文件涉及以下几个文件:
?2. 数据加载? ? ? ? 继承assignment1中的做法,使用tensorflow.keras进行数据加载,对data_utils.get_CIFAR10_data()进行了一点修改,如下所示(细节此处不再赘述,可以参考assignment1博客)。
3. 实现多层全连接网络? ? ? ? 主要就是修改layers.py(各affine和relu层组件)和fc_net.py(将各层组件像搭积木一样集成称为完整的网络)。layers.py中各层组件都可以直接集成assignment1的实现,包括softmax_loss,此处不再赘述。 ? ? ? ? fc_net.py的基本构成方法与assigment1-Q4大抵相同,但是assigment1-Q4中只有两层固定的,而本问题是要实现任意多层,所以主要需要一些coding实现的技巧,需要用for-loop循环的方式取代assignment1-Q4中的实现。在实现中需要特别仔细注意各层之间的数据和变量的传递和连接,为了防止出错,先画出一张图来,然后对照着图进行连接是一个明智的选择。如下图所示为一个3层网络的结构图示例: 图1 3层全连接网络结构示意图 ????????另外一个实现要点就是在forward/backward中第一层和最后一层的处理和其它中间层是不一样的。 ????????def __init__()追加的代码如下所示:
? ? ? ? forward处理和backward处理都集成在loss()中。 ? ? ? ? loss()#forward部分的代码如下所示:
????????loss()#backward部分的代码如下所示:
4. Sanity check?4.1 用小数据集训练一个三层网络? ? ? ? 完成了以上模型后,构建一个三层网络(两个中间层各100个节点)针对一个只有50个样本的小训练集进行试行训练,用于对模型进行基本的正确性验证(此即sanity check)。可以看到在训练集上轻松达到了100%的准确度,但是在验证集上只有可怜的17%,这当然意味着严重的overfit。 (Iteration 31 / 40) loss: 0.096088 (Epoch 16 / 20) train acc: 1.000000; val_acc: 0.171000 (Epoch 17 / 20) train acc: 1.000000; val_acc: 0.176000 (Epoch 18 / 20) train acc: 1.000000; val_acc: 0.173000 (Epoch 19 / 20) train acc: 1.000000; val_acc: 0.171000 (Epoch 20 / 20) train acc: 1.000000; val_acc: 0.173000 4.2??用小数据集训练一个五层网络????????接下来同样在小数据集上训练一个五层网络[100, 100, 100, 100]。这个实验的目的是获得一个关于深度神经网络训练的难度随着模型规模(复杂度)增加而增加的一个感性认识。 ? ? ? ? 五层网络不再像三层网络一样随意地指定一些参数就可以轻松达到100%的训练集性能。以下写了一个循环对learning_rate和weight_scale进行若干组合的扫描实验:
? ? ? ? 结果如下所示。可以看出,这个网络对于learning_rate和weight_scale非常地敏感,在某些参数组合中,在这个那个的模块里会出现overflow的问题。?只有weight_scale=0.1或者0.05跟learning_rate的某些组合情况下能够达到100%的训练集准确度。而在3层网络中使用weight_scale=0.01用在这里的话只能获得不到20%的训练集准确度。 F:\DL\cs231n\assignment2_chenxy\cs231n\layers.py:28: RuntimeWarning: overflow encountered in matmul out = np.reshape(x, (x.shape[0], -1)) @ w + b F:\DL\cs231n\assignment2_chenxy\cs231n\layers.py:146: RuntimeWarning: invalid value encountered in subtract scores = scores - np.max(scores,axis=1,keepdims=True)learning_rate=0.05, weight_scale=0.1, train_acc=0.08F:\DL\cs231n\assignment2_chenxy\cs231n\layers.py:28: RuntimeWarning: invalid value encountered in matmul out = np.reshape(x, (x.shape[0], -1)) @ w + b F:\DL\cs231n\assignment2_chenxy\cs231n\layers.py:61: RuntimeWarning: invalid value encountered in matmul dw = np.reshape(x, (x.shape[0], -1)).T @ doutlearning_rate=0.05, weight_scale=0.05, train_acc=0.08 learning_rate=0.05, weight_scale=0.025, train_acc=0.54 learning_rate=0.05, weight_scale=0.01, train_acc=0.16F:\DL\cs231n\assignment2_chenxy\cs231n\classifiers\fc_net.py:209: RuntimeWarning: overflow encountered in square loss += 0.5 * self.reg * np.sum(np.square(W)) F:\DL\cs231n\assignment2_chenxy\cs231n\classifiers\fc_net.py:209: RuntimeWarning: invalid value encountered in double_scalars loss += 0.5 * self.reg * np.sum(np.square(W))learning_rate=0.01, weight_scale=0.1, train_acc=0.08 learning_rate=0.01, weight_scale=0.05, train_acc=1.0 learning_rate=0.01, weight_scale=0.025, train_acc=0.42 learning_rate=0.01, weight_scale=0.01, train_acc=0.16 learning_rate=0.005, weight_scale=0.1, train_acc=0.08 learning_rate=0.005, weight_scale=0.05, train_acc=1.0 learning_rate=0.005, weight_scale=0.025, train_acc=0.3 learning_rate=0.005, weight_scale=0.01, train_acc=0.16 learning_rate=0.0025, weight_scale=0.1, train_acc=1.0 learning_rate=0.0025, weight_scale=0.05, train_acc=1.0 learning_rate=0.0025, weight_scale=0.025, train_acc=0.3 learning_rate=0.0025, weight_scale=0.01, train_acc=0.16 learning_rate=0.001, weight_scale=0.1, train_acc=1.0 learning_rate=0.001, weight_scale=0.05, train_acc=0.94 learning_rate=0.001, weight_scale=0.025, train_acc=0.3 learning_rate=0.001, weight_scale=0.01, train_acc=0.12 ? ? ? ? 在参数组合{learning_rate=0.01, weight_scale=0.05}条件下的loss和acc的变化趋势图如下所示: 5. 更新规则? ? ? ? 作业要求中所提的SGD+momentum、RMSProp and Adam其实在assignment1中都已经实现了,详细参见cs231n-2022-assignment1#Q4:Two-Layer Neural Network(Part2) ? ? ? ? 但是在测试中发现SGD+momentum无法通过一致性验证,仔细检查了以下,发现本作业中所描述SGD+momentum更新规则与我之前实现的不要一样。我在assigment1中实现的动量梯度下降的更新规则如下: ? ? ? ? 但是,?本作业中所给出的更新规则是这样的:
?????????虽然形式上不同,但是应该都能达到相同的效果,即数学意义上是等价的。 6.?Train a Good Model!? ? ? ? 做了以上准备工作后,是时候在这个训练一个深度神经网络看看能不能在cifar10数据集上获得比之前两层神经网络更好的分类准确度性能。搜索过程略过,最后得到一个3层网络,在以下参数配置条件下可以在验证集上得到55%的准确度。
? ? ? ? 同样在测试集上也可以得到55%的准确度。 ? ? ? ? 以上结果其实是有明显的过拟合现象,但是追加了reg=0.1的正则化,虽然训练集上的准确度下降了,但是验证集上的准确度也下降了。有待进一步调查。 ???????? ? ? ? ? 本作业assignment2将在全部完成之后统一上传。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 4:41:51- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |