反向传播案例实战
说明我们将实现一个 4 层的全连接网络,来完成二分类任务。 网络输入节点数为 2,隐藏层的节点数设计为: 25、 50和25,输出层两个节点,分别表示属于类别 1 的概率和类别 2的概率,如下图所示
生成数据12from sklearn.datasets import make_moons from sklearn.model_selection import train_test_split
123N=2000test_size=0.3X,y=make_moons(n_samples=N,noise=0.2,random_state=100)
划分训练集和测试集1X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=test_size,random_state=42)
1print(X.shape,y.shape)
(2000, 2) (2000,)
数据可视化1234import matplotlib.pyplot as pltplt.figure(figsize=(16,12))plt.scatt ...
反向传播算法推导
每层只有一个神经元
我们的目标是调整这些参数,使得代价C最小
这里以后两个神经元为例进行演示
首先推导代价函数关于权重w的偏导数
其中上标(L)代表第L层
$w^{(L)}$的的微小扰动会影响$z^{(L)}$,同样$z^{(L)}$的微小扰动会影响$a^{(L)}$,从而最终影响到代价值
它们之间的影响是通过链式法则传递的
现在来求解以上各个偏导数
当样本量不止一个时,则总的代价函数是许多训练样本代价的总和平均值
当然,对于多层的神经网络来说,以上所求仅仅是梯度中的一个分量
对于偏置项同样有以下推导
也可以求出代价函数对于上一层激活值的敏感度
主要是$z^{(L)}$对上一层的敏感度,其余不动
每层有若干神经元依然用上标括号内的数字代表第几层,同时用下标i和j分别标注第(L-1)层和第(L)层的神经元
在上图中,第L-1层有3个神经元,记连接第k个神经元和第j个神经元的(权重)连线为${w_{jk}}^{(L)}$
与之前的单个神经元相比,此时有3个神经元,因此代价函数是每一个神经元的代价值之和,每一层的权重个数也由一个:$w^{(L)}$变为3个:${w_{j0 ...
关于神经网络的哲学【HuLuan】思考
神经网络中有许多权重,每一个权重的变化都可能导致最终预测结果产生变动。为了最大可能获得较佳的预测结果,需要考虑合适的损失函数,激活函数以及优化器等,并通过训练,反反复复调整权重,直至得到满意的结果。
万象世间亦如是。
你所经历的每一件事,你所遇见的每一个人,于你而言都会在心中自动初始化一个权重。时间和事件会训练你的模型,为了最小化损失函数,也就是达成你的目的,你会一遍又一遍的采取措施来调整每一个权重。
不仅仅是你,每个人,每个生命,所有物质都在无时无刻的更新着自己的权重。于是地球围绕太阳转动,太阳东升西落,东西方产生时差,而现在,你正在阅读这些文字。
调整吧
就像歌中唱的那样: 时间会回答成长
成长的过程中,就在不断的调整权重,以期寻找一个最佳位置,安放自己。
可是,不同于神经网络的训练会在些许时间后结束,人要训练一生,并且优化目标可能会在不同的时间而各不相同。
这是一个动态的权重调整过程。
一次外出,一次游戏,一次对话,一次课程,一场考试,都可能导致优化目标的改变,随之而来的是很久一段时间内对相应优化目标做的权重调整,这段时间,可能是三天,可能是三年,也可能就这样一直下去。
调整 ...
列表,简单却强大-Python基础连载(九)
开篇
我们已经学习了数字和字符串这两种数据类型,它们都有一个共同的特点,那就是一个变量只能存储一个数字或者字符串,如果有多个数字或者多个字符串,那就必须得用多个变量来存储。
比如,现在有'abc','d',1,123,那么想要存储这些,必须这样做:
1234v1='abc'v2='d'v3=1v4=123
当有成百上千甚至更多个待存储的元素时,显然需要的变量个数会非常多,过程会无比繁琐。
别担心!本期要学习的列表就是填补这一缺憾的,学完之后,你会发现,上面的过程只需写成如下一行代码即可:
1v=['abc','d',1,123]
是不是迫不及待了,那就开始吧!
初识列表列表用[]来包裹,[]内部可存放元素,这些元素之间用逗号,隔开。
举个栗子,现在需要统计一下“南极小学”六年级的5个班中,每个班打算今年暑假去南极旅行的人数,假设各班统计上来的人数分别是11,111,1234,2233,666,使用列表可以这样存储:
1num_go=[11,111,1234,2333,66 ...
Tensorflow中的高级操作
tf.gather可以实现根据索引号收集数据
假设有4个班级,每班35人,共8门课程的成绩
举几个栗子
它等价于
但是对于不规则(连续)的索引,还是tf.gather()更强大
通过组合多个tf.gather,可以实现复杂一点的功能
现在,想要抽查第 2 个班级的第 2 个同学的所有科目, 第 3 个班级的第 3 个同学的所有科目,第 4 个班级的第 4 个同学的所有科目
这个更复杂了
可以这样
然后用stack()合并
但是还有更好的方法,那就是tf.gather_nd
tf.gather_nd也是根据索引号收集数据,只不过比tf.gather更灵活些
继续上面的例子
变得简洁了,只需传入一个列表
再举个复杂点的栗子:选取1班的学生1的科目2、2班的学生2的科目3、班级3的学生3的科目4的成绩,共有3个成绩数据
tf.boollean_mask以掩码方式选取数据
这里的 tf.boolean_mask 的用法其实与 tf.gather 非常类似,只不过一个通过掩码方式采样,一个直接给出索引号采样
其实它也可以像tf.gather_nd那样,做多 ...
Tensorflow进阶
张量合并1.拼接
2.堆叠
无论哪种方式,相应维度必须一致
分割合并的逆过程
将1个张量拆成多个张量
1. split等份分割
不等份分割传入列表,表示分割后每一部分的长度
2. unstack
可以看出,stack是在合并张量时增加了维度,而unstack是在分割张量时减少了维度
【注意】unstack一定会将原张量按照axis指定的维度方向分割成全部的部分的长度都是1的张量,因为只有这样才能将shape中为1的维度方向去掉
范数主要使用L1范数、L2范数和无穷范数
常用统计量最值:tf.reduce_max、tf.reduce_min
均值:tf.reduce_mean
和:tf.reduce_sum
指定axis
不指定axis此时会对全局求解:
应用场景求解所有样本的平均误差:
在分类问题中,求解概率最大值所在下标,即label假设有两个样本,做10分类问题
使用tf.reduce_max只能求解最大值,而使用tf.argmax可以求解最大值所在索引号(下标)
所以,这两个样本所属类别分别为8和9
张量比较还是拿10分类的栗子,假设有100个样本
开始比较
计 ...
Tensorflow基础
Tensor是什么
张量的维度也称作轴 (Axis)
一般把标量、向量、矩阵也统称为张量
TF中的数据类型数值,布尔,字符串
1.数值类型
在tf中创建标量
使用.numpy可以返回Numpy.array类型的数据
在tf中创建向量
此时,必须使用List容器传值
在tf中创建矩阵
在tf中创建三维张量
2.字符串类型
不怎么用,Python内置的字符串方法已经足够
3.布尔类型
tf的布尔类型和Python内置的布尔类型不等价
类型转换numpy ==> tensor
一般的,使用cast函数可完成不同数据类型,数据精度之间的转换
int ==> bool
bool ==> int
待优化的张量对于一些需要训练优化的参数,可设置tf.Variable类型
比如神经网络中,输入的X不需要包装成该类型,而w和b需要
name和trainable是Variable特有的属性
创建张量从数组,列表中创建convert_to_tensor和constant作用一样,都是创建张量
创建全0或全1的张量标量
向量
矩阵
可以使用 ...
分支循环,效率加速器-Python基础连载(八)
开篇你可能已经发现,前面的七期内容有一个共同的特点,那就是偏向理论基础,似乎学完之后只是了解了一些实用的方法,比如字符串如何进行增删改查,如何交互实现输入输出,Python运算符的种类等等。
此刻的你,是不是一点也没有感受到程序带来的效率翻倍?
今天就来填补这个大坑,一起来学习分支和循环吧!
分支所谓分支,可以形象的理解为一棵树的分叉:
满足哪个条件,就往哪个分叉方向前进。
写成Python伪代码的格式如下:
这便是最简单的分支结构:if...else...
还记得之前讲的缩进吗?在这里,:之后按回车键就会自动缩进了,一个缩进相当于按一次Tab键
缩进的存在,使得Python代码的可读性更强。
再举两个栗子来练习一下,建议小白同学手动敲一遍:
【栗子1】数字比较
123456x=1y=2if x>y: print('x比y大!')else: print('x比y小!')
输出:
1x比y小!
【栗子2】年龄验证
1234567age=input('请输入你的年龄:')age=int(age)#input输 ...
小小运算符,构筑大世界-Python基础连载(七)
开篇本期将介绍Python的运算符。
在正式开始之前,应该给运算符下个教科书式定义:
1运算符用于执行程序代码运算,会针对一个以上操作数项目来进行运算(百度百科)
好吧,这定义越看越晕。不管他了,咱们直接开始,在实际操作中理解运算符!
需要注意的是,你如果见到x=x+1这种操作,千万不要把这与数学上的操作混为一谈。
前面也提起过,在数学上,x=x+1中的=是等于的意思,而在编程语言中,=是赋值的意思,将=右边的值赋值给=左边。
所以,x=x+1在数学上是不成立的,但是在编程语言中,是将变量x做了加1的操作。
算数运算符1. + :加法运算
2. -:减法运算
3. *:乘法运算
4. / :普通除法运算
5. // :整数除法(整除)运算
6. ** :平方运算,a**b代表求a的b次方
7. % :取余运算
上个栗子:
12345678>>> 1+12>>> 1-10>>> 1*22>>> 3/21.5>>> 3//21>>> 2**3#求2的3次方8>>> ...
跳动的数字,熟悉又陌生-Python基础连载(六)
开篇经过前面与字符串的相爱相杀,相信你已经初步掌握了字符串的基本用法。本期将开始学习一个新的数据类型:数字。
在初高中,你已经学习了整数,小数,复数,这些包含在今天要讲的Python的数字类型中,正如上图所示(注:在这里你可以先把浮点数理解成小数,这对于之后的编程几乎没有影响,但随着学习的深入,你可能会发现这种理解是片面的)。
下面来逐个击破~
int & float这两种类型不用多说,你已经与它们打了多年的交道了。
还记得之前讲过的type()函数吗?它可以用来查看一个变量所属的数据类型。
嗯,意料之中。
在一些其他编程语言,如C语言中,\代表的是整除,比如3/2=1而不是1.5。
以前的Python2也这样干过,但是在Python3中(本系列教程一直在用的Python版本是Python3,还记得第一期的环境搭建内容吗?),这一规则被更改了,更改后的规则也许更符合大众的逻辑:
\代表我们所认知的普通除法,\\代表整除。
上个栗子:
bool布尔类型(bool)只有两种取值,True和False
你可能产生疑惑,这是哪门子数字类型啊?这不是英文单词吗!
首先用一个栗子反驳 ...