文章目录

  • 1. 使用激活函数去线性化(为什么要用激活函数)
    • 实验证明线性模型的局限性
    • 常用激活函数
  • 2. 神经网络复杂度:用网络层数和网络参数的个数表示
  • 3. 损失函数(loss):预测值(y)与已知答案(y_)的差距
    • 均方误差mse
    • 交叉熵ce(Cross Entropy):表征两个概率分布之间的距离
  • 4. softmax()函数:让n分类问题的n个输出(y1,y2, ...yn)满足概率分布
  • 5. 学习率(learning_rate):决定每次参数更新的幅度
  • 6. 滑动平均
  • 7. 正则化

1. 使用激活函数去线性化(为什么要用激活函数)

TensorFlow游乐场:http://playground.tensorflow.org

对于上一篇的网络TensorFlow笔记之二可以抽象为如下形式,

[y]=[a1,1a1,2a1,3]∗[w1,1(2)w2,1(2)w2,1(2)]=[x1x2]∗[w1,1(1)w1,2(1)w1,3(1)w2,1(1)w2,2(1)w2,3(1)]∗[w1,1(2)w2,1(2)w2,1(2)]\begin{gathered} \begin{bmatrix} y \end{bmatrix} \end{gathered}=\begin{gathered} \begin{bmatrix} a_{1,1} & a_{1,2} & a_{1,3} \end{bmatrix} \end{gathered} *\begin{gathered} \begin{bmatrix} w^{(2)}_{1,1}\\w^{(2)}_{2,1}\\w^{(2)}_{2,1} \end{bmatrix} \end{gathered}= \begin{gathered} \begin{bmatrix} x_{1} & x_{2} \end{bmatrix} \end{gathered} *\begin{gathered} \begin{bmatrix} w^{(1)}_{1,1} & w^{(1)}_{1,2} & w^{(1)}_{1,3} \\ w^{(1)}_{2,1} & w^{(1)}_{2,2} & w^{(1)}_{2,3} \end{bmatrix} \end{gathered}* \begin{gathered} \begin{bmatrix} w^{(2)}_{1,1}\\w^{(2)}_{2,1}\\w^{(2)}_{2,1} \end{bmatrix} \end{gathered} [y​]​=[a1,1​​a1,2​​a1,3​​]​∗⎣⎢⎡​w1,1(2)​w2,1(2)​w2,1(2)​​⎦⎥⎤​​=[x1​​x2​​]​∗[w1,1(1)​w2,1(1)​​w1,2(1)​w2,2(1)​​w1,3(1)​w2,3(1)​​]​∗⎣⎢⎡​w1,1(2)​w2,1(2)​w2,1(2)​​⎦⎥⎤​​
其中,令:
W′=W(1)W(2)=[w1,1(1)w1,2(1)w1,3(1)w2,1(1)w2,2(1)w2,3(1)]∗[w1,1(2)w2,1(2)w2,1(2)]=[w1′w2′]W^{'}=W^{(1)}W^{(2)}= \begin{gathered} \begin{bmatrix} w^{(1)}_{1,1} & w^{(1)}_{1,2} & w^{(1)}_{1,3} \\ w^{(1)}_{2,1} & w^{(1)}_{2,2} & w^{(1)}_{2,3} \end{bmatrix} \end{gathered}* \begin{gathered} \begin{bmatrix} w^{(2)}_{1,1}\\w^{(2)}_{2,1}\\w^{(2)}_{2,1} \end{bmatrix} \end{gathered}= \begin{gathered} \begin{bmatrix} w^{'}_{1}\\w^{'}_{2} \end{bmatrix} \end{gathered} W′=W(1)W(2)=[w1,1(1)​w2,1(1)​​w1,2(1)​w2,2(1)​​w1,3(1)​w2,3(1)​​]​∗⎣⎢⎡​w1,1(2)​w2,1(2)​w2,1(2)​​⎦⎥⎤​​=[w1′​w2′​​]​
这样,就可以得出
[y]=[x1x2]∗[w1′w2′]=w1′x1+w2′x2\begin{gathered} \begin{bmatrix} y \end{bmatrix} \end{gathered}= \begin{gathered} \begin{bmatrix} x_{1} & x_{2} \end{bmatrix} \end{gathered} * \begin{gathered} \begin{bmatrix} w^{'}_{1}\\w^{'}_{2} \end{bmatrix} \end{gathered}=w^{'}_{1}x_{1}+w^{'}_{2}x_{2} [y​]​=[x1​​x2​​]​∗[w1′​w2′​​]​=w1′​x1​+w2′​x2​
可以看出,该网络虽然有两层,但是它在本质上与单层神经网络没有区别,因为它可以被一个单层网络表示。由此可以推断,如果只是每个神经元只是单纯的线性变换,多层的全连接网络与单层的全连接网络的表达能力没有区别(通过矩阵运算,最终都会变成一个矩阵)。它们最终都是y是关于x1和x2的一个线性模型,而且线性模型解决问题的能力是有限的,这就是线性模型的最大局限性。

实验证明线性模型的局限性

本次实验在TensorFlow游乐场中进行。

情景模拟:现在根据x1(零件长度与平均长度的差)和x2(零件质量与平均质量的差)来判断一个零件是否合格(二分类问题)。因此,当一个零件的长度和质量越接近平均值(x1和x2接近零),那么这个零件越可能合格。那么它可能呈现如下分布

图中蓝色的点代表合格的零件(x1和x2接近零)。黄色的点代表不合格的(x1或x2偏大)。
将激活函数选择线性模型。训练100轮后

发现并不能很好的将零件区分开来。

将激活函数选择ReLu,训练100轮。

可以发现模型很好的将零件区分开来了。

常用激活函数

2. 神经网络复杂度:用网络层数和网络参数的个数表示


由于输入层只接受数据,不做计算故输入层不算层数。

3. 损失函数(loss):预测值(y)与已知答案(y_)的差距

网络优化目标:loss最小。
常用loss:

  1. mse(Mean Squared Error) 均方误差
  2. 自定义
  3. ce(Cross Entropy)交叉熵

均方误差mse


当预测值(y)与已知答案(y_)越接近–>均方误差MSE(y_, y)越接近0–>损失函数的值越小–模型预测效果越好

预测酸奶模型

# 预测import tensorflow as tf
import numpy as npBATCH_SIZE = 8
seed = 23455# 基于seed产生随机数
rng = np.random.RandomState(seed=seed)
X = rng.rand(32, 2)
Y_ = [[x1+x2+(rng.rand()/10.0-0.05)] for (x1, x2) in X]
Y = [[int(x0 + x1 <1)] for (x0, x1) in X]# 1、定义神经网络的输入、参数和输出,定义前向传播过程
x = tf.placeholder(tf.float32,shape=(None, 2))  # 知道每组有两个特征变量,但是不知道多少组,用None占位
y_ = tf.placeholder(tf.float32,shape=(None, 1)) # 存放真实的结果值,合格为1,w1 = tf.Variable(tf.random_normal([2, 1], stddev=1, seed=1))y = tf.matmul(x, w1)# 2、定义损失函数以及反向传播方法
loss = tf.reduce_mean(tf.square(y-y_)) # 使用均方误差计算loss
train_step = tf.train.GradientDescentOptimizer(0.001).minimize(loss) # 学习率为0.001,并让损失函数让减小的方向优化# 3、生成会话,训练STEPS轮
with tf.Session() as sess:# 3.1、初始化参数值init_op = tf.global_variables_initializer()sess.run(init_op)print("w1:\n", sess.run(w1))print("\n")# 3.2、训练模型STEPS = 30000for i in range(STEPS):# 3.2.1 每轮确定读取数据集的游标start = (i*BATCH_SIZE) % 32end = start + BATCH_SIZE# 3.2.2 喂入数据,开始训练sess.run(train_step, feed_dict={x: X[start:end], y_: Y_[start:end]})# 3.2.3 每500轮输出一次loss值if i % 500 == 0:print("每500轮输出一次w1的值\n")print(sess.run(w1), "\n")total_loss = sess.run(loss, feed_dict={x: X, y_: Y})print("After % dtraining step(s), cross entropy on all data is % g" % (i, total_loss))print("w1:\n", sess.run(w1))

交叉熵ce(Cross Entropy):表征两个概率分布之间的距离

H(y,y)=−Σy−∗logyH(y_,y) = -Σy_-*log y H(y,​y)=−Σy−​∗logy

4. softmax()函数:让n分类问题的n个输出(y1,y2, …yn)满足概率分布

∀xP(X=x)∈[0,1]且∑xP(X=x)=1softmax(y[]){\forall}x P(X = x) \in [0,1] 且 \sum_{x} P(X = x) =1 softmax(y[]) ∀xP(X=x)∈[0,1]且x∑​P(X=x)=1softmax(y[])
前面已经讲过,损失函数是用来衡量模型预测值与真实值之间的差值。即模型好坏的标准。一个模型越好,它的损失函数越小。因此,
神经网络的优化=减小损失函数

5. 学习率(learning_rate):决定每次参数更新的幅度

wn+1=wn−learningratew_{n+1}=w_{n}-learning_rate wn+1​=wn​−learningr​ate

6. 滑动平均

滑动平均(影子值):记录了每个参数一段时间内过往值得平均,增加了模型的泛化性。
针对所有的参数:w和b(类似给参数加了影子,参数变化,影子缓慢追随)
影子初始值=参数初始值
影子(滑动平均值) = 衰减率 * 影子 + (1-衰减率)* 参数
衰减率 = min{MOVING_AVERAGE_DECAY, (1+轮数)/(10+轮数)}

栗子:
MOVING_AVERAGE_DECAY(超参数:训练之前设置的参数)为0.99,
参数w1初始值为0
w1的滑动平均初始值为0

轮数global_step=0
w1 = 1
w1滑动平均值 = 0

衰减率 = min(0.99, 1/10)=0.1
w1滑动平均值 = 0.1 * 0 +(1-0.1) *1 = 0.9
所以,第0轮过后,w1的滑动平均值更新为0.9

global_step=100
w1 = 10
w1滑动平均值 = 0.9

衰减率 = min(0.99, 101/110)=0.918
w1滑动平均值 = 0.918 * 0.9 +(1-0.918) *10 = 0.8262 + 0.82 = 1.6482(误差由于四舍五入引起)

7. 正则化

正则化的意义是为了防止过拟合。

TensorFlow学习笔记之三(神经网络的优化)相关推荐

  1. TensorFlow学习笔记——深层神经网络

    引言 TensorFlow 版本1.15pip3 install tensorflow==1.15.0. 这是<TensorFlow实战Google深度学习框架(第2版)>的学习笔记,所有 ...

  2. 莫烦大大TensorFlow学习笔记(8)----优化器

    一.TensorFlow中的优化器 tf.train.GradientDescentOptimizer:梯度下降算法 tf.train.AdadeltaOptimizer tf.train.Adagr ...

  3. Tensorflow学习笔记——搭建神经网络

    目录 1.搭建神经网络6步法 2.函数用法和介绍 (1)tf.keras.models.Sequential() (2)Model.compile() (3)model.fit() (4)model. ...

  4. tensorflow学习笔记二——建立一个简单的神经网络拟合二次函数

    tensorflow学习笔记二--建立一个简单的神经网络 2016-09-23 16:04 2973人阅读 评论(2) 收藏 举报  分类: tensorflow(4)  目录(?)[+] 本笔记目的 ...

  5. tensorflow学习笔记——使用TensorFlow操作MNIST数据(1)

    续集请点击我:tensorflow学习笔记--使用TensorFlow操作MNIST数据(2) 本节开始学习使用tensorflow教程,当然从最简单的MNIST开始.这怎么说呢,就好比编程入门有He ...

  6. TensorFlow学习笔记--第三节张量(tensor)及其定义方法

    目录 在TensorFlow中,所有的数据通过张量的形式来表示 1张量及属性: 1.1维数(阶) 1.2 形状 1.3数据类型 TensorFlow 支持以下三种类型的张量: **1.常量** **2 ...

  7. tensorflow学习笔记(八):LSTM手写体(MNIST)识别

    文章目录 一.LSTM简介 二.主要函数 三.LSTM手写体(MNIST)识别 1.MNIST数据集简介 2.网络描述 3.项目实战 一.LSTM简介 LSTM是一种特殊的RNN,很好的解决了RNN中 ...

  8. tensorflow学习笔记(十):GAN生成手写体数字(MNIST)

    文章目录 一.GAN原理 二.项目实战 2.1 项目背景 2.2 网络描述 2.3 项目实战 一.GAN原理 生成对抗网络简称GAN,是由两个网络组成的,一个生成器网络和一个判别器网络.这两个网络可以 ...

  9. Tensorflow学习笔记-过度拟合问题

    Tensorflow学习笔记-过度拟合问题 神经网络在训练是,并不是希望模型尽量模拟训练的数据,而是希望模型对未来的数据具有准确的判断.因此,模型在训练数据上的表现并不代表对未来数据的表现.如果模型可 ...

最新文章

  1. 01.移动先行之谁主沉浮----我的第一个程序
  2. sitecore系统教程之架构概述
  3. 第一阶段:Java基础之数组
  4. windows7计算机管理,win7系统打开计算机管理(compmgmt.msc)的操作方法
  5. 003 python接口 cookies
  6. RPC规范接口实现模块Flask-JSONRPC
  7. Message Queue
  8. matlab哪些教材好,新手入门,恳请推荐一本matlab好教材
  9. HDU3579 Hello Kiki(CRT非互质)
  10. Pack up your loved ones 带上至亲至爱
  11. CAD文件怎么转成图片?手机也能轻松解决
  12. linux下brctl配置网桥
  13. Python批量转换文件夹下图片为PDF
  14. 浅析2022年6月六级翻译真题
  15. python里面pop,remove和del 三者的用法区别
  16. 清华老师终于把微服务讲清楚了
  17. 红米适配鸿蒙os,体验亮点满满!鸿蒙OS系统6月份开启适配,不只有华为手机
  18. 0096 克鲁斯卡尔算法,迪杰斯特拉算法
  19. scrollTo与scrollBy用法以及TouchSlop与VelocityTracker解析
  20. 直播卫星免费面临的困局

热门文章

  1. python 中间一列左对齐_Python|fstring我喜欢Python的原因之一
  2. 用c++来开发php的底层模块|用c++来开发apache模块,Apache模块开发实例(2)
  3. python dicom 器官分割_图像识别 | 使用Python对医学Dicom文件的预处理(含代码)
  4. 博士申请 | 南洋理工大学骆思强老师招收大数据/机器学习方向博士生、博士后...
  5. 全网首个OpenPrompt尝鲜报告:Prompt研究者必备实验利器
  6. EMNLP 2021 | PairSupCon:基于实例对比学习的句子表示方法
  7. 清华大学高阳:Mastering Atari Games with Limited Data
  8. 理论+技术+代码已经准备完毕!2021年啃透花书!
  9. 探究Softmax的替代品:exp(x)的偶次泰勒展开式总是正的
  10. 如何高效准备2021届秋招算法岗面试?