详解TensorFlow的 tf.contrib.layers.fully_connected 函数:全连接层

  • Post category:Python

TensorFlow的 tf.contrib.layers.fully_connected 函数用于定义全连接层,具体作用是将上一层的每个神经元都与本层的所有神经元相连,从而构建一个全连接矩阵。通常,全连接层是神经网络中最常用的一种层,因为它能够在不丢失重要信息的情况下,将上一层的所有特征进行组合,得到更加复杂的抽象特征。下面是完整的攻略:

函数定义

def fully_connected(inputs, num_outputs, activation_fn=nn.relu, 
                    weights_initializer=initializers.xavier_initializer(), 
                    biases_initializer=tf.zeros_initializer(),
                    weights_regularizer=None, biases_regularizer=None,
                    reuse=None, variables_collections=None, 
                    outputs_collections=None, trainable=True, scope=None):

函数参数说明:

  • inputs:输入的张量,通常是一个N维的Tensor。
  • num_outputs:输出的张量的个数,通常是一个整数。
  • activation_fn:激活函数,通常选择ReLU函数,当然也可以选择其他的激活函数,如sigmoid、tanh等。
  • weights_initializer:权重的初始化器,通常使用xavier_initializer()进行初始化。
  • biases_initializer:偏置的初始化器,通常使用tf.zeros_initializer()进行初始化(因为如果不设定偏置,则默认是全零偏置)。
  • weights_regularizer:权重的正则化器,通常使用L2正则化器,可以防止过拟合。
  • biases_regularizer:偏置的正则化器,通常不进行正则化。
  • reuse:是否允许变量共享,默认为None。
  • variables_collections:新建变量时会将其加入的集合。
  • outputs_collections:新建输出时会将其加入的集合。
  • trainable:是否此层可被训练。
  • scope:此层的名字,方便TensorBoard显示,也可以直接调用。

示例1: 创建一个三层神经网络

import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("./data", one_hot=True)

inputs = tf.placeholder(tf.float32, [None, 784])
labels = tf.placeholder(tf.float32, [None, 10])

hidden1 = tf.contrib.layers.fully_connected(inputs, 256)
hidden2 = tf.contrib.layers.fully_connected(hidden1, 256)
logits = tf.contrib.layers.fully_connected(hidden2, 10, activation_fn=None)

loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=labels, logits=logits))
train_op = tf.train.AdamOptimizer().minimize(loss)

sess = tf.Session()
sess.run(tf.global_variables_initializer())

batch_size = 128
for i in range(10000):
    batch_inputs, batch_labels = mnist.train.next_batch(batch_size)
    _, l = sess.run([train_op, loss], feed_dict={inputs: batch_inputs, labels: batch_labels})
    if i % 1000 == 0:
        print("step %d, loss = %.4f" % (i, l))

这个示例演示了如何使用全连接层创建一个三层的神经网络,并对MNIST数据集进行训练和测试。

示例2: 使用正则化的全连接层

inputs = tf.placeholder(tf.float32, [None, 784])
labels = tf.placeholder(tf.float32, [None, 10])

hidden1 = tf.contrib.layers.fully_connected(inputs, 256,
        weights_regularizer=tf.contrib.layers.l2_regularizer(0.001))
hidden2 = tf.contrib.layers.fully_connected(hidden1, 256,
        weights_regularizer=tf.contrib.layers.l2_regularizer(0.001))
logits = tf.contrib.layers.fully_connected(hidden2, 10, activation_fn=None)

loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=labels, logits=logits))
train_op = tf.train.AdamOptimizer().minimize(loss)

sess = tf.Session()
sess.run(tf.global_variables_initializer())

batch_size = 128
for i in range(10000):
    batch_inputs, batch_labels = mnist.train.next_batch(batch_size)
    _, l = sess.run([train_op, loss], feed_dict={inputs: batch_inputs, labels: batch_labels})
    if i % 1000 == 0:
        print("step %d, loss = %.4f" % (i, l))

这个示例演示如何在全连接层中加入L2正则化器对训练网络进行正则化防止过拟合。

以上是对TensorFlow的 tf.contrib.layers.fully_connected 函数作用与使用方法的完整攻略,希望对你有帮助。