前置
- 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 正则项一起使用