使用TensorFlow搭建FNN(全连接神经网络)的基本步骤

提示:转载请注明出处,若本文无意侵犯到您的合法权益,请及时与作者联系。

目录

一、定义神经网络的输入输出

二、搭建神经网络

1、定义一个神经层中的权重

2、定义一个神经层中的阈值

3、定义一个神经层中的激活函数

4、组合神经层为神经网络

三、搭建损失函数和优化器

1、搭建损失函数

首先介绍第一个函数这其中用到的共同的函数为

2、定义优化器  

四、训练神经网络


全连接神经网络的网络结构如下:

一、定义神经网络的输入输出

神经网络最擅长的工作就是模拟非线性函数,即一个复杂的高维映射,所以一个神经网络有输入就有输出。

在TensorFlow中我们一般使用placeholder()函数来定义神经网络的输入输出形式:

x_input = tf.placeholder(tf.float32, [None, 1], name='x_input')
y_input = tf.placeholder(tf.float32, [None, 1], name='y_input')

注意:placeholder()函数是在神经网络构建graph的时候在模型中的占位,此时并没有把要输入的数据传入模型,我们只是让系统分配了相应的内存。等之后建立session,运行模型的时候通过feed_dict()函数向占位符喂入数据。

placeholder()函数的形式如下:

tf.placeholder(
    dtype, #数据类型。常用的是tf.float32,tf.float64等数值类型
    shape=None, #数据形状。默认是None,就是一维值,也可以是多维(比如[2,3], [None, 3]表示列是3,行不定)
    name=None #名称,可以自定义,可以用来在TensorBoard中显示
)

二、搭建神经网络

一个神经网络由输入层、隐藏层和输出层决定,其中隐藏层和输出层中的神经元也叫做功能神经元,是我们要重点搭建的神经层。

一个神经层由多个神经元来构成,每个神经元由权重、阈值和激活函数构成。所以搭建一个神经元我们需要定义其相应的多个权重、多个阈值和激活函数(同一层神经元的激活函数一般相同)。

1、定义一个神经层中的权重

由于一个神经层中我们会有非常多个权重值,这些权重值的特点基本都是相似的,所以在TensorFlow中我们可以直接使用一个变量来存储这个神经层中的所有权重值。

一个神经层中的权重值数量=每个神经元的接收的输入个数*该层中神经元的所有个数,所以这个变量的数据形式就是一个行数为输入个数、列数为神经元个数的二维矩阵。

权重的初始值一般推荐为随机变量。

在TensorFlow中我们可以使用get_variable()函数和Variable()函数来定义:

# 方式一:定义一个名字为w1,形式为[n_features, n_l1],初始化方式为w_initializer,集合为c_names的变量
weights = tf.get_variable('w1', [n_features, n_l1], initializer=w_initializer, collections=c_names)
# 方式二:定义与初始化方式为tf.random_normal([in_size, out_size],名字为w1的变量
weights = tf.Variable(tf.random_normal([in_size, out_size]), name='w1')

get_variable()函数的用法如下:

     get_variable(name, # 变量名称
                  shape=None, # 变量形式
                  dtype=None, # 变量类型
                  initializer=None, # 变量初始化方式:tf.constant_initializer等
                  regularizer=None, # 变量所属于的集合
                  trainable=True,
                  collections=None,
                  caching_device=None,
                  partitioner=None,
                  validate_shape=True,
                  use_resource=None,
                  custom_getter=None)

Variable()函数的用法如下:

tf.Variable(initializer,# 变量初始化参数,可以有tf.random_normal,tf.constant,tf.constant等
             name # 变量名称
)

2、定义一个神经层中的阈值

类似地,由于每个神经元都只有一个阈值,所以一个神经层中的阈值个数就是我们的神经元个数。其初始化通常为不为0的小数,例如0.1。

所以在TensorFlow中我们可以使用一个行数为1,列数为神经元个数的初始值为0.1的一维矩阵的变量来表示:

# 方式一
b1 = tf.get_variable('b1', [1, n_l1], initializer=b_initializer, collections=c_names)
# 方式二
biases = tf.Variable(tf.zeros([1, out_size])+0.1, name='b')

3、定义一个神经层中的激活函数

接下来我们就是使用激活函数即可,激活函数传入的参数形式需要为:

tf.matmul(输入变量, 权重变量) + 阈值变量

上述中使用了tf.matmul(),表示矩阵相乘,注意输入变量必须为第一参数,不能交换顺序,因为矩阵乘法不遵守乘法交换律。

举个列子,假设输入变量是我们在第一步用占位符定义的的x_data,它的列数正好是第一层神经层的输入个数,所以可以进行矩阵相乘。

然后我们使用激活函数进行激活即可:

# 使用激活函数进行激活就得到了这一层的输出 
l1 = tf.nn.relu(tf.matmul(x_input, w1) + b1)

TensorFlow常见的激活函数有:sigmoid、tanh、relu、dropout等,详细解释可参考网上资料。

4、组合神经层为神经网络

知道如何搭建一个神经层后,搭建神经网络就简单了。神经网络就是将多个神经层串联起来(输入层不需要我们搭建)。

第一个神经层的输入为神经网络的输入数据,其输出正好为第二个神经层的输入数据,以此类推。

三、搭建损失函数和优化器

现在我们已经搭建好了神经网络,接下来考虑得就是如何更新神经网络,这就需要我们设计一个损失函数和优化器。

损失函数简单说就是用来衡量当前神经网络的输出值与真实的目标值之间的差距,优化器就是使用优化算法来让这个差距不断缩小。在TensorFlow中这个过程将会非常简单。

1、搭建损失函数

TensorFlow中可以使用交叉熵、均方差损失函数或者一些自定义的损失函数。

这里我们介绍下最常见的交叉熵损失函数或者均方差损失函数的使用。

 

(1)均方差损失函数,常用于回归问题中

loss = tf.reduce_mean(tf.square(q_target, q_eval))
loss = tf.reduce_mean(tf.squared_difference(q_target, q_eval))
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

(2)交叉熵损失函数,常用于分类问题中

# 交叉熵损失函数
cross_entropy=-tf.reduce_mean(y_*tf.log(tf.clip_by_value(y,1e-10,1.0)))
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_input * tf.log(prediction), reduction_indices=[1]))  
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

2、定义优化器  

在TensorFlow中定义优化器需要传入两个参数:学习率和损失函数。TensorFlow中一共有10多种优化器,其中大部分是梯度下降算法及其变种。


# 最基础的使用梯度下降法的参数优化器(一)
train_step = tf.train.GradientDescentOptimizer(learn_rate).minimize(cross_entropy)
# 最基础的使用梯度下降法的参数优化器(二)(0.5是学习率)
optimizer = tf.train.GradientDescentOptimizer(0.5)
train_step = optimizer.minimize(loss)
# RMSProp通过引入一个衰减系数,让r每回合都衰减一定比例
train_step = tf.train.RMSPropOptimizer(learn_rate).minimize(loss)

四、训练神经网络

接下来就是运行我们的神经网络,不断地输入数据去优化我们的神经网络模型,以下是一个示范,不过通用的就是流程就是:

创建会话、初始化变量、循环运行训练器。

    # 创建一个会话
    sess = tf.Session()
    # 初始化我们创建的变量
    init = tf.global_variables_initializer()
    sess.run(init)
    # 开始训练模型
    for i in range(max_step):
        batch_xs, batch_ys = mnist.train.next_batch(n_batch) # 每次从MNIST的训练集中随机抽取100个样例
        sess.run(train_step, feed_dict={x_input: batch_xs, y_input: batch_ys}) # 框抽取的样例输入到我们的模型进行训练
        if i % 50 == 0:
            print(compute_accuracy(mnist.test.images, mnist.test.labels))

猜你喜欢

转载自blog.csdn.net/qq_41959920/article/details/109183493