如何调整L2正则化

时间:2017-03-20 04:44:58

标签: machine-learning tensorflow neural-network deep-learning

我目前正在研究关于Udactity的Deep Learning

我成功构建并训练了一个隐藏层的神经网络,我的测试数据准确率达到了93%。但是,当我将L2正则化引入我的模型时。准确度下降到89%。我的正规化是否有问题?

beta = 0.01

n_hidden_layer = 1024
n_input = 784         # 28* 28
n_classes = 10

# Variables
weights = {
    'h1': tf.Variable(tf.truncated_normal([n_input, n_hidden_layer], stddev=0.1)),
    'out': tf.Variable(tf.truncated_normal([n_hidden_layer, n_classes], stddev=0.1))
}
biases = {
    'b1': tf.Variable(tf.constant(0.1, shape=[n_hidden_layer])),
    'out': tf.Variable(tf.constant(0.1, shape=[n_classes]))
}

def multilayer_perceptron(x, weights, biases):
    # Hidden layer with RELU activation
    layer_1 = tf.add(tf.matmul(x, weights['h1']), biases['b1'])
    layer_1 = tf.nn.relu(layer_1)
    # Output layer with linear activation
    out_layer = tf.matmul(layer_1, weights['out']) + biases['out']
    return out_layer

# Construct model 
pred = multilayer_perceptron(x, weights, biases)
valid_pred = multilayer_perceptron(tf_valid_dataset, weights, biases)
test_pred = multilayer_perceptron(tf_test_dataset, weights, biases)

# Define loss and optimizer
# L' = L + Beta * (0.5 * ||w||^2) 
l2 = beta * tf.nn.l2_loss(weights['h1']) + beta * tf.nn.l2_loss(weights['out'])
loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y, logits=pred) + l2)
optimizer = tf.train.GradientDescentOptimizer(0.5).minimize(loss)
  

适量的正规化应提高验证/测试的准确性。

但是当我将beta更改为0.001时,我的准确率达到了93.7%。那么,我应该将beta定义为tf.Variable来调整自己吗?

1 个答案:

答案 0 :(得分:2)

要理解为什么beta的变量你必须理解L2正则化的作用:它惩罚了大量的权重!惩罚这些重量应该多少取决于应用。有些应用需要比其他应用更大的权重

beta变量是您必须手动设置的参数"。这不应该作为tf.Variable添加。但是,你可以做的是创建一个快速超参数搜索,你可以迭代几个beta值来挑选最好的一个!尝试绘制几个值的损失,以确定最佳值!

如果您还有其他问题,请与我们联系!