张量(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)
相当于对输出归一化
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iJUXESBY-1632728451453)(neural network.assets/image-20210906161434796-16309811558541.png)]
特点:
(1)输出是0均值
(2)易造成梯度消失
(3)幂运算复杂,训练时间长
Relu函数
tf.nn.relu(x)
满足近似恒等性,计算速度快
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Sx8t99fA-1632728451457)(neural network.assets/image-20210906162350460.png)]
理论上来讲,Leaky Relu有Relu的所有优点,外加不会有Dead Relu问题,但是在实际操作当中,并没有完全证明Leaky Relu总是好于Relu。
对于初学者的建议:
首选relu激活函数;
学习率设置较小值;
输入特征标准化,即让输入特征满足以0为均值,1为标准差的正态分布;
初始参数中心化,即让随机生成的参数满足以0为均值,为标准差的正态分布。
损失函数
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无法利益最大化
自定义损失函数
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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