更多变量与Tensorflow中的多个训练路线

时间:2018-05-13 18:46:40

标签: python tensorflow

我正在 Tensorflow 中编写模拟,其中,在优化过程中,我需要在减去渐变时添加噪声。假设我有6种不同类型的噪声,它们都是从具有不同标准偏差的正态分布中提取的。在每次迭代期间,我决定从哪个分布产生噪声,然后将这种类型的噪声应用于所有可训练的变量。

实现这一点的一种方法是创建与可训练变量相同形状的变量,并在训练期间为它们分配不同的噪声值。例如,如果我有一些可训练变量W,我将创建其他变量W_noise

W = tf.Variable(tf.truncated_normal((n_inputs, n_neurons), stddev=stddev), name='W')
W_noise = tf.Variable(tf.random_normal(W.shape, stddev=stddev1))

然后我将有一个更新噪声变量的操作,在训练期间,我将选择生成它的标准偏差:

noise_op = tf.assign(W_noise, tf.random_normal(W_noise.shape, stddev=stddev2)

用于计算渐变的操作(假设我有一个字典noises,其中可训练变量为“键”,噪音变量为“值”,optimizerGradientDescentOptimizer和{ {1}}是张量var_list)的可训练变量列表:

loss

我想到的另一种方式是创建不同的优化路径,并在培训期间选择优化:

grads_and_vars = optimizer.compute_gradients(loss, var_list)
op = tf.group([ tf.assign(v, v - learning_rate*g + noises[v]) 
            for g, v in grads_and_vars])

在tensorboard中,它看起来像这样:

在图片中,每条路线都会添加不同标准偏差的噪音,同时减去渐变,我可以在训练期间选择通过哪条路线进行优化。

我的想法和问题

  1. 第一种方法在每次迭代期间有更多的运算来评估(为噪声变量赋值)并且有optimizer = tf.train.GradientDescentOptimizer(learning_rate) grads_and_vars = optimizer.compute_gradients(loss, var_list) for i, stddev in zip(range(6), stddev_list): with tf.name_scope('Route_' + str(i)): train_route[i] = tf.group( [ tf.assign(v, v - learning_rate*g + tf.random_normal(v.shape, stddev=stddev)) for g, v in grads_and_vars] ) 个变量消耗更多的内存。
  2. 第二种方式会产生更多更复杂的操作(应用渐变),并且由于噪声类型的数量是一个参数(并且可能相对较大),它可能会消耗更多的内存(还有多少?它是我的东西吗?应该担心?)
  3. 哪种方式更好(记忆,速度)?
  4. 有更好的方法来实现这个吗?
  5. 提前致谢。

0 个答案:

没有答案