为了在我的张量流神经网络中初始化权重,我从tf.random_normal()
开始。我正在寻找的是零附近的正态分布。为了消除过大的初始权重,我切换到tf.truncated_normal()
。由于-2.0和+2.0 仍然太大,我转移到tf.truncated_normal(stddev=0.1)
,解决了初始权重太大的问题。
但是,我还想消除太小的值(即太接近于零)。换句话说,除了重新选择所有权重< -0.2或> +0.2之外,我还想重新选择例如-0.02和+0.02之间的所有权重。有没有办法在蛮力while
循环之外执行此操作?换句话说,是否存在“反向”tf.truncated_normal()
?
P.S。我的思考的原因来自于talk with Ilya Sutskever的第27分钟之后,他讨论了太大或太小的随机初始化如何阻止网络学习。
答案 0 :(得分:2)
你可以通过将numpy数组输入到numpy数组中来创建一个tf.constant()
变量;
# Create a np.array however you want, manipulate and feed
weight_1 = np.random.normal(scale=0.1, size=(256, 64))
weight_1[weight_1 < 0] = weight_1[weight_1 < 0] - 0.01
weight_1[weight_1 > 0] = weight_1[weight_1 > 0] + 0.01
w = tf.constant(weight_1)
或者你可以通过initialize_all_variables()
函数在initialized_value()
之前操纵张量流张量,并从中创建一个张量。
weight_1 = tf.Variable(tf.random_normal([256, 64], stddev=0.35),
name="weight_1")
# code below will give you the weight_1 * 2
weights = tf.Variable(weight_1.initialized_value() * 2.0)
你可以用某种方式通过数学方法计算你所需要的价值,但是这种方式似乎更容易。
你正在做的事情看起来很像xavier initialization,你可以使用以下内容;
weight_1 = tf.get_variable('weight_1', shape=(256, 100),
initializer=tf.contrib.layers.xavier_initializer())