TensorFlow神经网络学习笔记

张量(tensor)

就是多维数组 阶代表张量的维数

维数 阶 名字
0-D 0 标量scalar
1-D 1 向量vector
2-D 2 矩阵 matrix
n-D n 张量 tensor

张量可以表示0阶到n阶的数组(列表)

数据类型

tf.int, tf.float…
tf.int 32,tf.float 32,tf.float 64
tf.bool
tf.constant([True, False])
tf.string
tf.constant(“Hello, world!”)

创建张量

tf.constant(张量内容,dtype=数据类型(可选))

numpy转tensor

将numpy的数据类型转换为Tensor数据类型
tf.convert to tensor(数据名,dtype=数据类型(可选))

创建全为0的张量tf.zeros(维度)
创建全为1的张量tf.ones(维度)
创建全为指定值的张量tf.fiII(维度,指定值)

生成正态分布的随机数,默认均值为0,标准差为1
tf. random.normal(维度,mean=均值,stddev=标准差)
生成截断式正态分布的随机数(随机数更集中,保证取值在μ±2σ)
tf.random.truncated normal(维度,mean=均值,stddev=标准差)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7x8Zak8T-1632728451439)(neural network.assets/image-20210909180355459.png)]

生成均匀分布随机数[ minval,maxval )
tf. random. uniform(维度,minval=最小值,maxval=最大值)

常用函数

tf.cast转换类型

强制tensor转换为该数据类型tf.cast(张量名,dtype=数据类型)

tf.reduce_min最小值

计算张量维度上元素的最小值tf.reduce_min(张量名)

tf.reduce_max最大值

计算张量维度上元素的最大值tf.reduce_max(张量名)

axis

在一个二维张量或数组中,可以通过调整axis等于0或1控制执行维度。
axis=0代表列(经度,down),而axis=1代表行(纬度,across)
如果不指定axis,则所有元素参与计算。

tf.Variable变量

tf. Variable()将变量标记为“可训练”,被标记的变量会在反向传播中记录梯度信息。神经网络训练中,常用该函数标记待训练参数。

tf.Variable(初始值)

w = tf.Variable(tf.random.normal([2, 2], mean=0, stddev=1))

数学运算

只有维度相同的张量才可以做四则运算

对应元素的四则运算:tf.add,tf.subtract,tf.multiply,tf.divide

平方、次方与开方:tf.square,tf.pow(张量名,n次方数),tf.sqrt

矩阵乘:tf.matmul

tf.data.Dataset.from tensor slices特征对应标签

切分传入张量的第一维度,生成输入特征标签对,构建数据集
data = tf.data.Dataset.from_tensor_slices((输入特征,标签))

(Numpy和lTensor格式都可用该语句读入数据)

tf.GradientTape求导

with结构记录计算过程,gradient求出张量的梯度
with tf.GradientTape( ) as tape:
若干个计算过程
grad=tape.gradient(函数,对谁求导)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9WJ3UGEH-1632728451441)(neural network.assets/image-20210910153126291.png)]

enumerate枚举

enumerate是python的内建函数,它可遍历每个元素(如列表、元组或字符串),组合为:索引元素,常在for循环中使用。
enumerate(列表名)

tf.one_hot独热码

tf.one hot(待转换数据,depth=几分类)

独热编码(one-hot encoding):在分类问题中,常用独热码做标签,标记类别:1表示是,0表示非。

(0狗尾草鸢尾,1杂色鸢尾,2弗吉尼亚鸢尾)
标签:1
独热码: (0.1.0.)

tf.nn.softmax 使输出符合概率分布

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pkyJ3Iy1-1632728451443)(neural network.assets/image-20210910153814824.png)]

输出概率分布与独热码做比较

当n分类的n个输出(V。,V. …y1)通过softmax()函数,便符合概率分布了。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-i8VQvd4u-1632728451444)(neural network.assets/image-20210910154344465.png)]

assign_sub 自更新

赋值操作,更新参数的值并返回。
调用assian sub前,先用tf.Variable定义变量w为可训练
可自更新)。
w.assign_sub(w要自减的内容)

tf.argmax指定维度最大值索引

返回张量沿指定维度最大值的索引tf.argmax(张量名,axis=操作轴)

预备知识

tf.where

tf.where(条件语句,真返回A,假返回B)

a=tf.constant([1,2,3,1,1))

b=tf.constant([0,1,3,4,5])
c=tf.where(tf.greater(a,b), a,b)#若a>b,返回a对应位置的元素,否则返回b对应位置的元素
print(“c:”,c)
运行结果:
c: tf.Tensor([1 2 3 4 5], shape=(5,), dtype=int32)

np.random.RandomState.rand()

返回一个[0,1)之间的随机数
np.random.RandomState.rand(维度)#维度为空,返回标量

np.vstack()

将两个数组按垂直方向叠加np.vstack(数组1,数组2)

np.mgrid[ ] .ravel() np.c_[]

一般一起使用生成网格坐标点

np.mgrid[ ] [起始值,结束值)

np.mgrid[起始值:结束值:步长, 起始值:结束值:步长,… ]

行数由第一个参数1:4:0.5决定,为6行,列数由第二个参数2:4:0.5决定,为4列。

x.ravel()将x变为一维数组,“把.前变量拉直”

np.c_[]使返回的间隔数值点配对
np.c_[数组1,数组2,…]

神经网络(NN)复杂度

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JEbkkJKX-1632728451446)(neural network.assets/image-20210906084736474-16309812243145.png)]

NN复杂度:多用NN层数和NN参数的个数表示

空间复杂度:

层数=隐藏层的层数+1个输出层

图为2层NN
总参数=总w+总b
图3x4+4 + 4x2+2=26
第1层 第2层

时间复杂度:

乘加运算次数
图3x4 + 4x2 = 20
第1层 第2层

学习率Ir

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sVacWnW7-1632728451449)(neural network.assets/image-20210906085549555-16309812206664.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VPMiLmuk-1632728451451)(neural network.assets/image-20210906085913765-16309812178803.png)]

参数w初始化为5,学习率为0.2则
1次参数 w : 5 5-0.2*(2*5+2)=2.6

2次参数 w : 2.6 2.6-0.2*(2*2.6+2)=1.16

3次参数 w : 1.16 1.16-0.2*(2*1.16+2)=0.296

4次参数w:0.296

指数衰减学习率

可以先用较大的学习率,快速得到较优解,然后逐步减小学习率,使模型在训练后期稳定。
指数衰减学习率=初始学习率*当习率衰减率(当前轮数/多少轮衰减一次)

激活函数

对于线性函数,即使有多层神经元收尾相接构成深层神经网络,依旧是线性组合,模型的表达力不够,所以需要激活函数,提高模型的表达力,神经网络可以随层数的增加提高其表达力

优秀的激活函数

非线性:激活函数非线性时,多层神经网络可逼近所有函数

(只有激活函数是非线性的才不会被单层网络替代,使其自身有了意义)

可微性:优化器大多用梯度下降更新参数

单调性:当激活函数是单调的,能保证单层网络的损失函数是凸函数

近似恒等性:f(x)约等于x 当参数初始化为随机小值时,神经网络更稳定

激活函数输出值的范围:

激活函数输出为有限值时,基于梯度的优化方法更稳定

激活函数输出为无限值时,建议调小学习率

常用的激活函数

sigmoid

tf.nn.sigmoid(x)

相当于对输出归一化

image-20210906155823901

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bvV5Dn8N-1632728451451)(neural network.assets/image-20210906155917016-16309811816132.png)]

特点:

1.易造成梯度消失

(深层神经网络更新参数时,需要从输出层到输入层逐层进行链式求导,而sigmoid函数的导数输出是00.25的小数,链式求导需要多层导数连续相乘,会出现多个00.25的连续相乘,使结果趋于0,造成梯度消失)

2.输出非0均值,收敛慢

3.幂运算复杂,训练时间长

Tanh函数

tf.math.tanh(x)

image-20210906161348300

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iJUXESBY-1632728451453)(neural network.assets/image-20210906161434796-16309811558541.png)]

特点:

(1)输出是0均值

(2)易造成梯度消失

(3)幂运算复杂,训练时间长

Relu函数

tf.nn.relu(x)

满足近似恒等性,计算速度快

image-20210906161620066

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OQW6SfKa-1632728451454)(neural network.assets/image-20210906161647654.png)]

优点: 缺点:
(1)解决了梯度消失问题(在正区间) (1)输出非O均值,收敛慢

(2)只需判断输入是否大于0,计算速度快 (2)Dead Relu问题:某些神经元可能永远不

(3)收敛速度远快于sigmoid和Itanh 被激活,导致相应的参数永远不能被更新

解决dead relu

原因:经过relu函数的负数特征过多

解决:改进随机初始化,避免过多的负数特征被送入relu函数;通过设置更小的学习率

,减少参数分布的巨大变化,避免训练过程产生过多负数被送入relu函数

Leaky Relu函数

tf.nn.leaky_relu(x)

image-20210906162324020

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Sx8t99fA-1632728451457)(neural network.assets/image-20210906162350460.png)]

理论上来讲,Leaky Relu有Relu的所有优点,外加不会有Dead Relu问题,但是在实际操作当中,并没有完全证明Leaky Relu总是好于Relu。

对于初学者的建议:

首选relu激活函数;

学习率设置较小值;

输入特征标准化,即让输入特征满足以0为均值,1为标准差的正态分布;

初始参数中心化,即让随机生成的参数满足以0为均值,image-20210906162601181为标准差的正态分布。

损失函数

loss:y和y_的差距

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XSZz6Xx2-1632728451459)(neural network.assets/image-20210906164655978.png)]

均方误差(mse)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MrGkzSd3-1632728451462)(neural network.assets/image-20210906164740240.png)]

loss_mse=tf.reduce_mean(tf.square(y_-y))

用均方误差,默认预测多少损失一样

在实际中,预测销量多了,损失成本,预测少了,损失利润,而利润不等于成本,则mse产生的loss无法利益最大化

自定义损失函数

image-20210907101325374

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KMpmEOa6-1632728451465)(neural network.assets\image-20210907101404461.png)]

loss_zdy=tf.reduce_sum(tf.where(tf.greater(y,y\_),(y-y\_)*cost,(y-y\_)\*profit))

交叉熵CE(Cross Entropy)

tf.losses.categorical_crossentropy(y_,y)

**表征两个概率分布之间的距离

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cLYMau5O-1632728451468)(neural network.assets/image-20210907103543325.png)]

with tf.GradientTape() as tape:

	hl = tf.matmul(x_train, wl)+ b1hl = tf.nn.relu(h1)
	y = tf.matmul (hl,w2)+b2
	loss_mse = tf.reduce_mean(tf.square(y_train - y))
	loss_regularization = []
	loss_regularization. append (tf.nn.l2_loss (w1))
	loss regularization. append(tf.nn.12_loss (w2))
	loss_regularization = tf.reduce_sum (loss regularization)
	loss = loss_mse + 0.03 * loss_regularization

variables = [w1,b1,w2,b2]
grads 
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值