笔记 - DNN: 构建网络 与 添加正则化项的不同方式

前置

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

最简单的全连接网络

import tensorflow.contrib.layers import fully_connected
hidden1 = fully_connected(X, n_hidden1, scope="hidden1")
hidden2 = fully_connected(hidden1, n_hidden2, scope="hidden2")

"""
X为输入矩阵
n_hidden1为隐藏层1的节点数
"""

添加正则化

import tensorflow.contrib.layers import fully_connected
hidden1 = fully_connected(X, 
						  n_hidden1, 
						  scope="hidden1", 
						  weights_regularizer=tf.contrib.layers.l2_regularizer(scale=0.01))
hidden2 = fully_connected(hidden1, 
						  n_hidden2, 
						  scope="hidden2",
						  weights_regularizer=tf.contrib.layers.l2_regularizer(scale=0.01)

arg_scope + 正则化添加

with tf.contrib.framework.arg_scope(
		[fully_connected],
		weights_regularizer=tf.contrib.layers.l2_regularizer(scale=0.1)):
	hidden1 = fully_connected(X, n_hidden1, scope="hidden1")
	hidden2 = fully_connected(hidden1, n_hidden2, scope="hidden1")

手动构建

# 构建神经网络层,我们这里两个隐藏层,基本一样,除了输入inputs到每个神经元的连接不同
# 和神经元个数不同
# 输出层也非常相似,只是激活函数从ReLU变成了Softmax而已
def neuron_layer(X, n_neurons, name, activation=None):
    # 包含所有计算节点对于这一层,name_scope可写可不写
    with tf.name_scope(name):
        # 取输入矩阵的维度作为层的输入连接个数
        n_inputs = int(X.get_shape()[1])
        stddev = 2 / np.sqrt(n_inputs)
        # 这层里面的w可以看成是二维数组,每个神经元对于一组w参数
        # truncated normal distribution 比 regular normal distribution的值小
        # 不会出现任何大的权重值,确保慢慢的稳健的训练
        # 使用这种标准方差会让收敛快
        # w参数需要随机,不能为0,否则输出为0,最后调整都是一个幅度没意义
        init = tf.truncated_normal((n_inputs, n_neurons), stddev=stddev)
        w = tf.Variable(init, name='weights')
        b = tf.Variable(tf.zeros([n_neurons]), name='biases')
        # 向量表达的使用比一条一条加和要高效
        z = tf.matmul(X, w) + b

        reg_loss = tf.reduce_sum(tf.abs(w))
        reg_loss = tf.reduce_sum(tf.square(w))
        tf.add_to_collection("reg_losses", reg_loss)

        if activation == "relu":
            return tf.nn.relu(z)
        else:
            return z


with tf.name_scope("dnn"):
    hidden1 = neuron_layer(X, n_hidden1, "hidden1", activation="relu")
    hidden2 = neuron_layer(hidden1, n_hidden2, "hidden2", activation="relu")
    hidden3 = neuron_layer(hidden2, n_hidden3, "hidden2", activation="relu")
    # 进入到softmax之前的结果
    logits = neuron_layer(hidden3, n_outputs, "outputs")
reg_loss = tf.reduce_sum(tf.abs(w))
reg_loss = tf.reduce_sum(tf.square(w))

L1 L2 正则项一起使用

猜你喜欢

转载自blog.csdn.net/chen_holy/article/details/91426294
DNN