第一章:神经网络理论知识
【第二章】TensorFlow
一,全连接神经网络
从本篇内容开始作为从<神经网路基础到量化投资应用>系列笔记的第二部分,主要用于神经网络的实现,由于自己不是计算机专业,所以许多语言的知识就不再细说,写博客的目的就是最终可以写完一个完整的模型,可以使用,并且知道为什么这么写。本篇内容主要想写4部分,第一节全连接神经神经网络,第二节卷积神经网络(CNN),第三节循环神经网络(RNN),第四节为一些扩展和问题。在学习的过程中看了好多Tensorflow的文章,都是在讲其中的结构,而本篇博客将直接从代码出发,直接粘贴复制就可以使用。我的重点不是写TensorFlow的内部架构,而是讲写代码的逻辑。每一篇博客将直接是上代码,解释,上代码,解释,,,这样的结构。
Tensorflow的配置和安装计算模型储存模型数据模型等相关知识这里一概不再讲解,直接上代码。
一,一个.py完成正向传播和反向传播
这个例子是TensorFlow书上的一个经典例子,即MNIST_DATA分类,是学习TF所必须经过的数据集,它包含了60000张图片作为训练数据,10000张图片作为测试数据。在MNIST数据集中的每一张图片都代表了手写体的0-9中的一个数字。我们就是要设计一个模型可以对其进行分类。
直接上码:
代码1可以直接下载运行。文章末尾有代码资源,下面是一个只有一个隐藏层的神经网络,是我自己对代码的一个解剖。
- 代码1
第一部分、导入相关的模块
import tensorflow as tf
# 导入tensorflow框架
from tensorflow.examples.tutorials.mnist import input_data
# 导入MNIST_DATA数据
第二部分、参数设置
# MNIST数据集相关的常数
INPUT_NODE = 784 # 输入层的节点数。对于MNIST数据集,这个就等于图片的像素
# 在MNIST_Data数据集中每一张图片的长和宽都是28像素的,所以一张图片共有28x28=784个像素点。
OUTPUT_NODE = 10
# 输入层的节点数。这个等于类别的数目。因为在MNIST数据集中,
#需要区分的是0-9这10个数字,所以这里输出层的节点数为10
# 配置神经网络的参数
LAYER1_NODE = 500
#隐藏层节点数。这是使用只有一个隐藏层的网络结构作为样例。
BATCH_SIZE = 100
#一个训练batch中的训练数据个数,数字越小,训练过程越接近随机梯度下降:
# 数字越大,训练越接近梯度下降。
# 相当于我们把60000张图片分批进行计算,每一批为100张,
LEARNING_RATE_BASE = 0.8 #基础的学习率
参数更新过程:
w : = w − α d w b : = b − α d b 基 础 学 习 率 即 为 这 里 的 α w:=w-\alpha dw \\ b:=b-\alpha db \\ 基础学习率即为这里的 \alpha w:=w−αdwb:=b−αdb基础学习率即为这里的α
LEARNING_RATE_DECAY = 0.99 # 学习率衰减速度。
在神经网络的学习过程中,如果学习率设置的太大,那么模型将在最优点的位置
徘徊,不能到达最优点,如果学习率设置的太小,那么模型将收敛速度将会大幅降低,
所以,设置学习率的指数衰减,即学习率随着迭代次数的增加而变小(衰减),从而
即不浪费计算资料也可使得模型可以很好的收敛到最优点附近。
指数衰减公式:
α ′ = α ∗ d e c a y r a t e g l o b a l s t e p d e c a y s t e p s α : 为 学 习 率 ( L E A R N I N G _ R A T E _ B A S E ) d e c a y r a t e : 为 衰 减 速 率 , 即 为 这 里 的 L E A R N I N G _ R A T E _ D E C A Y g l o b a l s t e p : 为 当 前 的 迭 代 轮 数 d e c a y s t e p : 通 常 为 e x a m p l e s n u m B A T C H _ S I Z E , 即 训 练 完 所 有 数 据 需 要 的 迭 代 次 数 \alpha' = \alpha * decay_{rate}^{\frac{global_{step}}{decay_{steps}}} \\ {}\\ \alpha: 为学习率({LEARNING\_RATE\_BASE})\\ {}\\ decay_{rate}:为衰减速率,即为这里的LEARNING\_RATE\_DECAY\\ {}\\ global_{step}:为当前的迭代轮数\\ {}\\ decay_{step}:通常为\frac{examples_{num}}{BATCH\_SIZE},即训练完所有数据需要的迭代次数 α′=α∗decayratedecaystepsglobalstepα:为学习率(LEARNING_RATE_BASE)decayrate:为衰减速率,即为这里的LEARNING_RATE_DECAYglobalstep:为当前的迭代轮数decaystep:通常为BATCH_SIZEexamplesnum,即训练完所有数据需要的迭代次数
在该公式中decay_steps为一个常数,decay_rate是一个小于1的数,所以随着迭代次数(global_step)的增加,学习率将会指数级的进行衰减。
REGULARIZATION_RATE = 0.001 # 描述模型复杂度的正则化项在损失函数中的系数。
正则化
模型的过拟合现象就是由于模型在训练集上的损失函数过于小而导致泛化能力大幅减弱,
如果我们用R(w)来表示模型的复杂度,那么如果模型发生过拟合,就说明R(w)会变得过大。解决方法就是不要使得R(w)过大,做法就是将R(w)和损失函数J(θ)放在一起训练,它俩是一对矛盾,其中一个减小另外一个一定增大。所以,损失函数用J(θ)+λR(w)来代替,λ表示复杂度项在整体损失的权重。
常见的R(w)有:
R ( w ) = ∣ ∣ w ∣ ∣ 1 = ∑ i ∣ w i ∣ R ( w ) = ∣ ∣ w ∣ ∣ 2 2 = ∑ i ∣ w i 2 ∣ R ( w ) = ∑ i α ∣ w i ∣ + ( 1 − α ) w i 2 J ( θ ) + λ R ( w ) R(w)=||w||_1=\sum_i|w_i|\\ R(w)=||w||_2^2 = \sum_i|w_i^2|\\ R(w)=\sum_i \alpha|w_i|+(1-\alpha)w_i^2\\ J(\theta)+\lambda R(w) R(w)=∣∣w∣∣1=