为了初始化 tensorflow 神经网络中的权重,我从 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()
?
附注我的思考原因来自于一条talk with Ilya Sutskever第27分钟后他在其中讨论了太大或太小的随机初始化如何阻止网络学习。
最佳答案
您可以通过将 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()
函数操作 tensorflow 张量,并从中创建一个张量。
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)
你可以通过某种方式计算出你需要的值,但 numpy 方式似乎更容易。
而且你正在做的事情看起来很像 xavier initialization ,您可以按如下方式使用;
weight_1 = tf.get_variable('weight_1', shape=(256, 100),
initializer=tf.contrib.layers.xavier_initializer())
关于python - 选择小于给定标准差的随机正态值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42638373/