据我所知,Variable是制作变量的默认操作,get_variable主要用于权重分享.
一方面,有些人建议在需要变量时使用get_variable而不是原始Variable操作.另一方面,我只是get_variable在TensorFlow的官方文档和演示中看到任何使用.
因此,我想知道如何正确使用这两种机制的一些经验法则.有没有"标准"原则?
我正在玩一个ANN,这是Udacity DeepLearning课程的一部分.
我有一个任务,涉及使用L2丢失将一个隐藏的ReLU层引入网络.我想知道如何正确地引入它,以便所有权重都受到惩罚,而不仅仅是输出层的权重.
没有概括的网络代码位于帖子的底部(实际运行培训的代码超出了问题的范围).
引入L2的明显方法是用这样的方法替换损失计算(如果beta为0.01):
loss = tf.reduce_mean( tf.nn.softmax_cross_entropy_with_logits(out_layer, tf_train_labels) + 0.01*tf.nn.l2_loss(out_weights))
Run Code Online (Sandbox Code Playgroud)
但在这种情况下,它会考虑输出层权重的值.我不确定,我们如何正确地惩罚进入隐藏的ReLU层的权重.是否需要它或引入输出层的惩罚将以某种方式保持隐藏的权重也检查?
#some importing
from __future__ import print_function
import numpy as np
import tensorflow as tf
from six.moves import cPickle as pickle
from six.moves import range
#loading data
pickle_file = '/home/maxkhk/Documents/Udacity/DeepLearningCourse/SourceCode/tensorflow/examples/udacity/notMNIST.pickle'
with open(pickle_file, 'rb') as f:
save = pickle.load(f)
train_dataset = save['train_dataset']
train_labels = save['train_labels']
valid_dataset = save['valid_dataset']
valid_labels = save['valid_labels']
test_dataset = save['test_dataset']
test_labels = save['test_labels']
del save # hint to help gc free up memory
print('Training …Run Code Online (Sandbox Code Playgroud) machine-learning neural-network regularized deep-learning tensorflow
我习惯使用tf.contrib.layers.fully_connected来构建一个完全连接的层.最近我遇到了tf.layers.dense,显然是在第一个功能可以使用的地方使用的.可互换,产生相同的输出吗?
我添加了内置的正则化器tf.contrib.layers.l2_regularizer:
regularizer = tf.contrib.layers.l2_regularizer(scale=0.1)
layer1 = tf.layers.dense(tf_x, 50, tf.nn.relu, kernel_regularizer=regularizer)
layer2 = tf.layers.dense(layer1, 50, tf.nn.relu, kernel_regularizer=regularizer)
output = tf.layers.dense(layer2, 5, tf.nn.relu)
Run Code Online (Sandbox Code Playgroud)
我为scale(0.1-1)尝试了不同的值,但它似乎没有做太多.我想知道是否必须在其他位置(即优化器,火车等)添加正则化器,或者这可能仅仅是由于我的数据.
我没有调整我的代码中的任何其他位置的正则化器,然后在tf.layers上面.
我在其他问题中发现使用张量流在卷积网络中进行 L2 正则化的标准方法如下。
对于每个conv2d层,设置参数kernel_regularizer是l2_regularizer这样的
regularizer = tf.contrib.layers.l2_regularizer(scale=0.1)
layer2 = tf.layers.conv2d(
inputs,
filters,
kernel_size,
kernel_regularizer=regularizer)
Run Code Online (Sandbox Code Playgroud)
然后在损失函数中,收集reg损失
reg_losses = tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES)
reg_constant = 0.01 # Choose an appropriate one.
loss = my_normal_loss + reg_constant * sum(reg_losses)
Run Code Online (Sandbox Code Playgroud)
包括我在内的很多人都犯了跳过第二步的错误。这意味着kernel_regularizer没有很好地理解的含义。我有一个我无法证实的假设。那是
通过设置
kernel_regularizer单层,您告诉网络将这一层的内核权重转发到网络末端的损失函数,以便稍后您可以选择(通过您编写的另一段代码)将它们包含在损失函数中的最终正则化项。而已。
它是正确的还是有更好的解释?