使用Tensorflow搭建神经网络
神经网络基本结构:输入层,隐含层和输出层
上图说明:在输入层输入数据,然后数据飞到隐藏层,最后飞到输出层,用梯度下降处理,梯度下降会对几个参数进行更新和完善,更新后的参数再次跑到隐藏层去学习,一直循环至结果收敛。
神经网络内部结构参数:
激励函数:这些函数与其他层的输出联合使用可生成特征途。用于对某些运算的结果进行平滑(或微分),目标是为神经网络引入非线性。激励函数种类:tf.nn.relu、tf.nn.relu6、tf.nn.crelu、tf.nn.elu、tf.nn.selu、tf.nn.softplus、tf.nn.softsign、tf.nn.dropout、tf.nn.bias_add、tf.sigmoid、tf.tanh。
激活函数特性:
- 函数是单调的,可利用梯度下降大寻找局部极值点
- 函数是可微分的,保证在定义域内任意一点导数存在,使得特度下降法能够正常使用来自这类激活函数的输出
满足此类条件均可作为激活函数。
神经层:
定义神经网络参数有inputs,in_size,out_size,和activation_function,其内部定义变量包含:权值weights、偏差biases、计算公式。若为分类问题,需要添加交叉熵函数cross_entropy。
def add_layer(inputs,in_size,out_size,activation_function=None):
weights=tf.Variable(tf.random_normal([in_size,out_size]))
biases=tf.Variable(tf.zeros([1,out_size])+0.1)
wx_plus_b=tf.matmul(inputs,weights)+biases
if activation_function is None:
outputs=wx_plus_b
else:
outputs=activation_function(wx_plus_b)
return outputs
cross_entropy=tf.reduce_mean(-tf.reduce_sum(ys*tf.log(prediction),
reduction_indices=[1]))
train_step=tf.train.GradientDescentOptimize(0.5).minimize(cross_entropy)
overfitting过拟合:
采用Tensorflow中的dropout,用来降低cnn网络中过拟合现象的工具。
dropout是指在深度学习网络的训练中,针对神经网络单元,按照一定的概率将其暂时从网络中丢弃。对于随机梯度下降来说,由于是随机丢弃,故而每一个mini-batch都在训练不同的网络。
代码实现:在add layer函数里加上dropout,keep_prob是一个概率,保持多少的概率不被丢弃,在迭代时继续执行sess.run,当某个特征被丢弃时,其值设为0.0。
#here to dropout
#在wx_plus_b上drop掉一定比例
#keep_prob保持多少不被drop,在迭代时在sess.run中feed
wx_plus_b=tf.nn.dropout(wx_plus_b,keep_prob)
搭建神经网络基本流程
1.使用import导入需要的库信息
2.定义添加神经层的函数(定义出参数Weights,biases,拟合公式y,误差公式loss)
def add_layer(inputs,in_size,out_size,activation=None):
3.训练数据的准备(导入或者随机定义训练的数据)
4.使用tf.placeholder()定义节点准备接收数据
5.定义神经层:隐藏层和预测层 (上一层的输出即为下一层的输入)
l1=add_layer(xs,1,10,activation_function=tf.nn.relu)
prediction=add_layer(l1,10,1,activation_function=None)
6.定义 loss 表达式
loss=tf.reduce_mean(tf.reduce_sum(tf.square(ys_prediction),reduction_indices=[1]))
7.选择 optimizer 使 loss 达到最小
train_step=tf.train.GradientDescentOptimizer(0.1).minimize(loss)
#采用的优化方法是GradientDescentOptimizer(),即梯度下降法
#学习率为0.1
8.所有变量进行初始化
tf14.0版初始化变量:init=tf.global_variables_initialize()
sess=tf.Session()
sess.run(init) #开始运算
9.通过 sess.run optimizer,迭代 1000 次进行学习。
完整代码例子:
import tensorflow as tf
import numpy as np
#2.添加层
def add_layer(inputs,in_size,out_size,activation_function=None):
#add one more layer and return the output of this layer
weights=tf.Variable(tf.random_normal([in_size,out_size]))
biases=tf.Variable(tf.zeros([1,out_size])+0.1)
wx_plus_b=tf.matmul(inputs,weights)+biases
if activation_function is None:
outputs=wx_plus_b
else:
outputs=activation_function(wx_plus_b)
return outputs
#### 3.训练的数据
#### Make up some real data
x_data = np.linspace(-1,1,300)[:, np.newaxis]
noise = np.random.normal(0, 0.05, x_data.shape)
y_data = np.square(x_data) - 0.5 + noise
#### 4.定义节点准备接收数据
#### define placeholder for inputs to network
xs = tf.placeholder(tf.float32, [None, 1])
ys = tf.placeholder(tf.float32, [None, 1])
#### 5.定义神经层:隐藏层和预测层
#### add hidden layer 输入值是 xs,在隐藏层有 10 个神经元
l1 = add_layer(xs, 1, 10, activation_function=tf.nn.relu)
#### add output layer 输入值是隐藏层 l1,在预测层输出 1 个结果
prediction = add_layer(l1, 10, 1, activation_function=None)
#### 6.定义 loss 表达式
#### the error between prediciton and real data
loss = tf.reduce_mean(tf.reduce_sum(tf.square(ys - prediction),
reduction_indices=[1]))
#### 7.选择 optimizer 使 loss 达到最小
#### 这一行定义了用什么方式去减少 loss,学习率是 0.1
train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss)
#### 8. important step 对所有变量进行初始化
init = tf.global_variables_initializer()
sess = tf.Session()
#### 上面定义的都没有运算,直到 sess.run 才会开始运算
sess.run(init)
#### 9. 迭代 1000 次学习,sess.run optimizer
for i in range(1000):
# training train_step 和 loss 都是由 placeholder 定义的运算,所以这里要用 feed 传入参数
sess.run(train_step, feed_dict={xs: x_data, ys: y_data})
if i % 50 == 0:
# to see the step improvement
print(sess.run(loss, feed_dict={xs: x_data, ys: y_data}))
运行完代码结果如下图:
出现Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX AVX2这个提示,不影响最后结果。在网上查了其原因,大致意思是说:这是个编译问题,tensorflow觉得你的电脑CPU还行,支持AVX(Advanced Vector Extensions),但CPU没有得到充分的利用,不能使用SSE4.1 SSE4.2 AVX AVX2 FMA这些指令集进行编译,运行速度还可提升,可开启更好更快的模式。从官网下载源码不会出现这种问题,如果用GPU可以忽略此警告,
添加代码:import os
os.environ['TF_CPP_MIN_LOG_LEVER']='2'