重新排列小于给定标准偏差的随机正常值

时间:2017-03-07 01:02:30

标签: python tensorflow neural-network

为了在我的张量流神经网络中初始化权重,我从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分钟之后,他讨论了太大太小的随机初始化如何阻止网络学习。

1 个答案:

答案 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())