Tensorflow搭建第一个神经网络

使用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'