NLP学习D2-TF2基础学习-北大教程
今天主要学tf2和动手实践;如果有时间,看下Transformer系列的细节!!加油!
一、环境配置
老师很贴心,带着装环境。
1、我建个github仓库~
2、设置了一个conda的默认清华镜像
参考链接:
https://blog.csdn.net/CV_YOU/article/details/83098414
3、环境配置
python3.7
二、chap1
装环境的时候看看课程
(一)、1.1三学派
1、三类
(1)行为主义
感知-动作控制系统???机器人单脚站立,感知方向,控制动作,保持平衡
(2)符号主义
公式
(3)连接主义
连接感知
2、步骤
准备数据;
搭建网络;
优化参数:训练,反向传播
应用网络:保存模型,进行前传预测
(二)1.2神经网络设计过程
1、鸢尾花种植者并不需要严格的if判断(逻辑判断),而是通过感知,也就是我们可以用神经网络模拟的东西。
2、基础概念
损失函数-SME均方误差
优化参数=梯度下降+反向传播
3、跑代码【c1-c13】
测试不同的学习率情况
过小:很慢
过大:摇摆,找不到最优值
(三)1.3张量生成
1、什么是张量?
0维数组-数字
1-向量
2-矩阵
±张量
2、数据类型
tf.int, tf.float,tf.bool,tf.string
3、如何用tf创建张量?
tf.cosntant(张量内容,dtype =数据类型)
例如:
a = tf.constant([1,5],tf.int64)
ps:
通过a.shape可以查看形状,有几个点,就是几维张量
4、如何将numpy转换为tf的数据类型?
tf.convert_to_numpy(数据名,dtype=)
例子:
c1p18
5、自己创建张量
tf.zeros(维度)
tf.ones(dim)
tf.fill(dim,value)
括号中:
一维:个数
二维:[行,列]
多维:[n,m,j,k…]
6、如何初始化参数呢?
正态分布随机数
tf.random.normal(dim,mean,stddev=标准差)
tf.random.truncated_normal(dim,mean,stddev=)
均匀分布随机数—左闭右开
tf.random.uniform(dim,minval=,maxval)
1.4TF2常用函数
1、axis如何理解呢?0代表什么?
0是指第一维度;
一般0是纵向;1是横向
2、如何标记带训练参数?
tf.Variable(初始值)
例如:
w = tf.Variable(tf.random.normal([2,2],mean=0.stddev=1))
3、加减乘除函数
tf.add( , )
tf.substract(,)
tf.multiply(,)对应相乘,不是矩阵乘法哦
tf.divide(,)
只有维度相同才可以做四则运算,就是要一个对应一个
4、平方、次方、开方函数?
tf.square( 张量)
tf.pow(张量,n次方)
tf.sqrt(张量)
5、矩阵乘法函数?
tf.matmul(矩阵1,矩阵2)
都说明了是矩阵的乘法哦
ps:在用tf定义张量时,【】里面有几个数就是几维,数的大小对应该维度数的个数。
但是用shape查看形状时,逗号个数和维度是对应的;
用print时,'[[[['个数和维度对应,比如像左边四个‘['代表四维。
------------现在时8:55,刚刚去了下校医院看膝盖,前两天跑步跑伤了,排号的时候,把chap1看完了,总结一下,可以开始看代码了。
把最后项目的代码,看着注释敲一下,然后最后要到没有注释自己心中有框架的地步。
1.5常用函数1
1、求导的函数?
这里用了一个with结构,需要查一下用法
【查的时候突然想起来给师弟看gitee上代码问题,发现之前传错了,弄到了9:26】
with应该是避免异常的:
而使用with的话,能够减少冗长,还能自动处理上下文环境产生的异常。
https://www.cnblogs.com/sddai/p/14411906.html
比较清楚了
https://blog.csdn.net/youzhouliu/article/details/80976004?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1.pc_relevant_default&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1.pc_relevant_default&utm_relevant_index=1
wtih tf.GradientType() as tape:
若干计算过程
grad = tape.gradient(函数,对谁求导)
2、如何枚举?
这其实是python内建函数 for i,ele in enumerate(…)
3、如何设置独热编码
tf.one_hot(带转换数据,depth=几分类)
4、softmax函数如何写?作用?
作用:使输出符合概率分布
tf.nn.softmax(x)
5、参数自更新函数作用?如何写?
求导后进行自更新;
assign_sub
6、argmax作用?
tf.argmax(张量名,axis=操作轴)
0纵向;1横向
自己跑前面的代码
1、normal是正太分布;uniform是均匀分布
2、在tf中定义数据类型的时候要加上tf
3、合并特征与标签
tf.data.Dataset.from_tensor_slices
4、定义常量要加.
现在11:07,把class1中除了最后的大作业都加了代码提问注释,并且“回答”。先去吃饭,吃完饭继续写大作业!!!
----------现在是12:47,刚才吃饭+走路+饭后站着消食的时候把class2看完了,感慨万分!老师甚至把深度学习的一些基础知识讲的太好了!!!比如说,激活函数、损失函数、优化器(如何利用导数进行反向传播优化)、指数衰减学习率之类的,下午具体说。此外,老师讲代码的思路也很清晰!感谢知识开源!!!爱了!听这种课就是享受!
我现在桌子上趴一会,然后起来自己实现class1最后一个代码和class2的所有代码。
------13:17趴了一会,做了一个已经忘了的梦!!!趴一会真的很清醒!!!现在来敲代码!!!!!!!!先敲chap1最后一个,再回顾chap2,再敲chap2
chap1终极boss代码
1、错误1
这里原来打错了,打成x_data,导致维度不匹配。x_test是150;y_test是30
2、错误2
在计算正确率的时候,并未将correct reduce_sum,导致总是在第一轮训练的时候报错提前结束。
3、通过写底层的代码:
(1)对batch有更深入的理解
batch=32,也就意味着每次32个y一起算loss。batch不同,还是有影响的。
每epoch的每个batch都是直接投32个数据。
(2)plt中的legend就是图注,最好不要写中文的标题。。显示不出来
4、这里之所以写axis=1
是因为行数据是这样的,我想要每行,也就是横向数据中最大的索引
5、最后可视化是每一epoch都可视化
画的是train的loss和test的acc
-----现在14:33了,自己敲完一遍,感觉收获很多,但是还是没有完全掌握,先commit一下。接下来看下class3,然后敲class2的代码
chap2
1、预备知识(后续会用到)
(1)tf.where(条件语句,A,B)
(2)返回[0,1)之间的随机数
np.random.RandomState.rand(维度)
可以通过
rdm = np.random.RandomState(seed=1)实例化一个钟字为1的rdm
然后用a = rdm.rand()生成一个随机标量,未传参数就代表是标量
b = rdm.ran(2,3)2*3随机矩阵,数值大小在[0,1)
(3)如何将两个数组按照竖直方向叠加
np.vstack()
叠加完,一维变成二维
(4)下面的三个理解不深入,用到的时候再说
关于np.mgrid()用法的小实验
所以,np.mgrid[]里面有几组,就会生成几位数据。
(5).x.ravel()
(6)np._c[]返回间隔数值点之间的配对
2、神经网络复杂度(掠过)
略
3、指数衰减学习率(讲的很好)
lr过大容易造成忽悠忽悠的,老是错过最好的值;
过小会导致太慢;
so,先大一点,找到很好的区域,然后再精调
这个就是指数衰减学习率
超参数为
(1)初始学习率
(2)学习率衰减率
(3)多少轮衰减一次
变量为轮数
也就是说,我们可以设置一个最初的速度,然后设置一个减慢一次的速度,然后设置一下多久根据这个减慢的速度见一次。当然,由于是指数形式,所以随着轮数增大,衰减速度也就也来越小,那么学习率减小的速度也会越来越小,实现精细地调试/
这里的多少论跳一次也不是多少论衰减一次,其实每一轮都在衰减,随着轮数的增大;只不过“多少论衰减一次”这个参数可以近似看作是这个效果罢了。
4、激活函数(特点清晰)
(1)优秀的激活函数
a、非线性:多层后,可逼近所有函数【哭了,好清晰,刚学的时候,完全不理解】
b、可微性:梯度下降
c、单调性:保证单层网络的损失函数是凸函数(凸函数我记得就是有最大值那种吧,好优化)
参考
:https://www.zhihu.com/question/22125449
d、近似恒等性
第一次听说,这个意思就是f(x)=x,比如Relu,这样的好处是,初始化为随机小值时,神经网络稳定。
关于激活函数输出值的范围这点,不太理解
有限值,就像sigmoid,tanh;
无限,就像Relu?为啥要调校学习率呢?
(2)sigmoid
a\导数在0-0.25,多层网络,容易梯度消失
b\输出均值非0均值,全为整的哦,0-1;但为啥会收敛慢呢
c\函数有幂运算,比较复杂,训练时间长
(3)Tanh
a\输出是0均值,解决了sigmoid收敛慢的问题
b\导数是0-1,仍旧有梯度消失的问题
c\还有幂运算,训练时间长
(4)Relu
pros:
a\正区间内,解决梯度消失
b\函数只需判断是否大于0,没有幂运算,快
c\收敛速度快,为啥快呀?
cons:
a\输出为非0均值,收敛慢
b\Dead ReLu问题(应该是负数部分求导为0吧)
(5)Leaky Relu
xswl继承了Relu的优点,解决了Dead ReLu的问题。
但
(6)初学者选择建议
首选relu
学习率设小点
特征要标准函,0均值,1为标准差,正态分布(为啥)
莫大大的文章的意思是把数据的归一化,避免单位不同造成的偏差
https://zhuanlan.zhihu.com/p/24839177
这篇更加“复杂”一点,但更详细客观,有时间看把
https://www.cnblogs.com/shine-lee/p/11779514.html
获取无关性
不需要scaling的模型
与距离计算无关----朴素贝叶斯;树模型
初始参数中心化
5、损失函数(非常清晰!尤其是MSE和交叉熵的对比)
**NN优化目标:loss最小!!!**虽然大家应该都知道,但我觉得很重要,标出来!
(1)mse
字面理解好吧
(2)自定义
更加灵活。看一种自定义的方式,用到了前面提到的预备知识,所以这个讲义很妙!成本和利润的损失系数不同,通过比较大小,来确定是成本还是利用。所以这个where和greater结合,可以很好地表达分段函数。
(3)ce
表征两个概率分布之间的距离,越小越近
这句话经典了!!!!!
鹅鹅鹅tf里还有softmax和交叉熵结合的一键到家服务
6、欠拟合和过拟合(可以随便看看,写了解决方式)
不理解为什么过拟合可以通过数据清洗解决?
粗略搜索,没找到答案。。。。直接问下同学吧
看到底下关于正则化缓解过拟合的解释里提到噪声,我猜想是不是,噪声过多会导致拟合的过于复杂,所以清理数据有用;底层原理和正则化,给w加权值(减小其作用),弱化数据作用,减少噪声影响的一样
7、正则化减少过拟合(讲清了L1和L2的区别)
我猜,不正则化b是因为b不影响噪声吧
l1和l2的公式在底下,特点也列出来了:
l1会减少参数,因为很多参数会为0;
l2会减小参数。
但是我不能通过他们的数学表达式,联想到为什么。
甚至还有代码,就随便看看吧
因为后面六步法肯恶搞不太需要,而且底下的优化器更精彩!
这里他主要是用代码写了一下如何写正则化,其实就一条命令tf.nn.l2_loss(w1)的事情,把需要正则化的 参数传进去
8、优化器更新网络参数(加强了我对优化器的理解,很有用强推!!!但是特点方面感觉没有吴恩达讲的好,吴恩达讲了啥我也忘了。。。)
简而言之,我对于优化器的理解:
反向传播+梯度下降理论确实可以对目标函数进行优化。但是梯度具体如何下降,就由优化器来解决了~~
优化器有点像教书的老师,水平特点也不太一样,所以对于同一个孩子,往同一个方向教书(比如高考向),但是效果可能不一样。具体还是取决于孩子和老师是不是投缘啊。
所谓动量,我的理解就是,之前的力量,也就是借助之前的信息。一阶动量就是一次方的之前信息,二阶就是二次方。SGF没有用动量;SGDM用来一阶动量(指数平滑);Adagrad用的二阶动量(直接求之前的平方和,用的时候再开方);RMSProp也用二阶动量(用的是平方指数平滑);Adam结合了SGDM和RMSProp,用了一阶动量和二阶动量的指数平滑,并且做了修正。不过为什么要写成m/根号v,我还不太理解
(1)SGD
简单常用
(2)SGDM
在sgd基础上加入momentum一阶动量
mt就是gt的指数平均,也就是之前梯度的平均值。
二阶动量Vt为1,也就是不设置
β为学习率,越大越偏向之前的,一般偏向1?
(记得听了一耳朵,经验值好像是0.9?)
(3)Adagrad
在SGD上加入二阶动量,也就是对于之前的一阶动量平方求和,用的时候开方
(4)RMSProp
sgd加入二阶动量;
这个和Adagrad一样也是二阶动量,只不过用的是之前一阶动量平方的指数平均。
(5)Adam
Adam结合了SGDM和RMSProp,用了一阶动量和二阶动量的指数平滑,并且做了修正。阿蛋好强。!
chap3
听了3.1开始庆幸chap1.-1只写了一次,chap2还没敲。八股六步太爽了吧!
1、import
2、train,test
(引入数据集,划分数据集(也可以不划分,到下面的fit中设置。),打乱顺序,,,;总之,就是做数据的预处理,为训练做准备)
3、model = tf.keras.models.Sequential
(定义模型结构)
(还有一种class写法,好像更灵活一点)
4、model.compile(定义优化器、损失函数,metrics,主要是优化时候的事情)
优化器Adadelta前面没提过,先不查了,用的时候再说。
loss选交叉熵的话,from_logits=False说明用的不是原本神经元的输出数据,而是通过softmax归一化的数据。要和前面softmax的使用对应。
Metrcs主要说的是优化指标。
这里只提了acc,其实也可以有其他指标叭。
需要注意,不同种类的acc选择是依据y_和y的格式:都是数值,就选acc;两个one_hot选categorical_acc;y_为数值,y是one_hot选sparse_categoraical_acc
5、model.fit(进行训练,设置batch_size,epochs,测试集相关信息。主要是训练时候的设置)
6、model.summary()
打印网络结构、参数个数
7、用class定义结构
把原来第三步换一下
这个class呀,有点面向对象编程的意思。鹅鹅鹅,我还不熟悉,不过没关系啦~
大体格式:
1、继承Model
2、__init__函数里写super()…
然后在定义各种“积木”——你的网络结构块
3、call函数里拼接调用init里的积木,实现前向传播,返回y
4、最后实例化你的modle就ok
-------------------15:01,看完chap3拉~打算休息一下,回来总结chap2,总结、跟敲chap3前面的代码,最后自己做fashion数据集的作业!!!!!开心啊!感觉自己要上天了!
------------------------15:06开始写chap2重要基础理论的总结
--------------------------17:01chap2写完已经这个点了omg,不过收获颇丰。休息一下直接写chap3的八股六步。
------------17:08我要写个代码,然后去吃饭拿快递了!!!最近膝盖伤了,不能锻炼哎。
------------17:28写完chap3的总结,还有24行的sequential模型没敲;10行的model定义没敲;还有一个mnist;和自己挑战一下fashion数据集;吃完饭、拿完快递再来叭,估计今天又学不了CATTI了。
------------20:12吃完饭好累,去拿了快递,背了单词顺便把chap4也看完了,老师讲的太好了!!!想直接先把课看完~
--------20:30为了买护膝,去量了个腿围,凑了个单!!!终于可以看课了!!
---------22:25还没看完,但是看到chap6了,rnn讲的也很清楚!不过要多看几遍!先去刷牙洗脸,然后去床上看,明天复现!
NLP学习D2-TF2基础学习-北大教程相关推荐
- Python学习教程(Python学习路线_Python基础学习教程_Python视频教程):初学者新手怎样快速入门Python
Python学习教程(Python学习路线_Python基础学习教程_Python视频教程):初学者新手怎样快速入门Python? 人生苦短,我用Python!!!短短几个字,现在在各大学习类平台随处 ...
- 医用计算机基础学习心得,计算机基础学习心得.doc
计算机基础学习心得 计算机基础学习心得一:计算机基础学习心得 当今社会,到处充满机会与挑战.知识是我们面对这一切的筹码,而计算机知识则更为重要.如何在本科函授这样一种形式下,学好计算机课程,这是摆在我 ...
- 学习笔记-零基础学习人工智能(0)
学习笔记-零基础学习人工智能(0) 背景 规划 背景 作为物理专业的大龄青年,由于兴趣爱好想学习下人工智能.主要感兴趣的方向是对抗样本生成.自己也做了一些了解,但是发现千头万绪,不懂的东西太多.为了梳 ...
- ①小白学习Linux之基础学习★
Linux基础学习√ 1.centos6和7的变化 1.1.文件系统 1.2.防火墙.内核版本.默认数据库 1.3.时间同步,修改时区,修改语言 1.4.主机名 1.5.网络服务管理 1.6.网络设置 ...
- Scala学习(一)--Scala基础学习
Scala基础学习 摘要: 在篇主要内容:如何把Scala当做工业级的便携计算器使用,如何用Scala处理数字以及其他算术操作.在这个过程中,我们将介绍一系列重要的Scala概念和惯用法.同时你还将学 ...
- 全栈学习之CSS基础学习
CSS基础学习 1. CSS导入方式 行内样式 内部样式 外部样式 2. 三种基本选择器 2.1 标签选择器 2.2 类选择器 2.3 id选择器 2.4 关联 3. 层次选择器 3.1 后代选择器 ...
- 【中间件学习】Fluentd基础学习教程
文章目录 引言 安装 推荐的安装方式: 其他安装方式的采坑 测试验证 学习过程 1. 先学习一个简单的采集示例: 2. 学习一下fluentd相关的关键字配置. 日志接入实践 总结 引言 Fluent ...
- 深度学习-计算机视觉-0基础-学习历程
周志华<机器学习>------------------------若是想从基础算法公式开始可以先试着看一下周志华的<机器学习>,由于我对公式推导很头疼,看了几页就跳过了.(在经 ...
- 素描学习入门零基础学习静物素描的几种方法
在讲之前我们先来简单了解一下静物素描的定义:"静物写生是对形体质感表现的一种形式,主要利用笔触.线条和调子和明暗关系的变化." 比如在画坚硬物体-铁骑.陶瓷.玻璃等的时候,线条要严 ...
- 愣头青法学习openstack——零基础学习openstack的建议
由于收到很多人的私信,问我如何高效快速学习openstack,今天在这里就给大家分享一下我的openstack学习心得. 我也是刚入门学习openstack的小黑,所以先写几句话放在前面,应该很合逻辑 ...
最新文章
- Numpy和Pandas的区别
- oracle创建表分区表,oracle创建分区表
- 一位ACMer过来人的心得【转】
- 介绍一款贼美的Vue+Element开源后台管理UI
- 2021数据技术嘉年华线上召开,万人观看,迎接国产数据库的耕获菑畬之年
- 【英语学习】【WOTD】vox populi 释义/词源/示例
- redis和mecache和ehcache的特点
- js中字符串类型转化toString、parseInt、parseFloat、Number
- 【Linux】常用命令之 awk 常用实例
- 图像标注工具labelImg安装教程及使用方法
- vue中属性key的作用(了解diff),为什么不建议index作为key
- 软件测试培训一般多少钱?
- 02【代词】人称代词,指示代词,不定代词?
- linux应用/软件设置为系统服务
- 写段小程序,为自己的配置加个密
- 10种方法帮助网络管理员管理和维护网络
- C# 关于Lambda表达式
- 出现“您的设备内部出现了问题。请联系您的设备制造商了解详情”错误后,kernel的配置问题查找
- 深度学习环境配置_ubuntu18及以上
- mysql导出trigger_用mysqldump导出Trigger问题解决方法_MySQL
热门文章
- 都2020年了,你还不会写简洁的Java代码!(转载)
- java计算机毕业设计云端小区物业智能管理系统源码+系统+mysql数据库+lw文档+部署
- 万能Prompt句式拆解,人人都是Prompt 工程师
- python利用itchat监控微信好友的头像是否更换(纯属娱乐)
- Android用kotlin修改一个图片编辑库做一个作业点评的功能
- fpga控制vga显示黑白图片
- c# 调用mysql存储过程 返回值_C#调用MySQL存储过程,函数的最佳方法
- 用p5.js制作烟花特效
- 几种混合模式移动应用开发框架的对比
- Win10连接远程桌面的时候提示您的凭证不工作该怎么办?