variables - 在tensorflow中,如何初始化部分变量
问题描述
我想初始化一个变量列表,并将它们定义为一个名为“block_var”的列表。我想使用截断的正常方法来初始化它们。
block_var = [v for v in tf.global_variables() if 'block' in v.name]
init_block = tf.variables_initializer(var_list = block_var)
那我该怎么办?我努力了
for v in block_var:
v.initializer = tf.truncated_normal_initializer()
我也试过
init_block = tf.truncated_normal_initializer()
两个领域。
解决方案
解决方案 1
您需要为get_variable
like传递初始化程序参数
import tensorflow as tf
import numpy as np
ref0 = tf.get_variable('block0', [2], initializer=tf.truncated_normal_initializer(mean=40))
ref1 = tf.get_variable('block1', [2], initializer=tf.truncated_normal_initializer(mean=40))
ref2 = tf.get_variable('block2', [2], initializer=tf.truncated_normal_initializer(mean=40))
ref4 = tf.get_variable('foo0', [2], initializer=tf.truncated_normal_initializer(mean=10))
ref5 = tf.get_variable('foo1', [2], initializer=tf.truncated_normal_initializer(mean=10))
block_vars = [v for v in tf.global_variables() if 'block' in v.name]
block_vars_complement = [v for v in tf.global_variables() if 'block' not in v.name]
with tf.Session() as sess:
sess.run(tf.variables_initializer(var_list=block_vars))
print(np.mean(sess.run([ref0, ref1, ref2])), 'should be ~ 40')
try:
print(np.mean(sess.run([ref4])))
except Exception as e:
print('[INFO] failed as expected with message %s' % e)
sess.run(tf.variables_initializer(var_list=block_vars_complement))
print(np.mean(sess.run([ref4, ref5])), 'should be ~ 10')
解决方案 2
如果您不想将 传递initializer
给每个,则get_variable
可以使用自定义 getter,例如
import tensorflow as tf
import numpy as np
def my_getter(getter, name, shape, *args, **kwargs):
if 'block' not in name:
return getter(name=name, shape=shape, *args, **kwargs)
else:
kwargs['initializer'] = tf.truncated_normal_initializer(mean=40)
return getter(name=name, shape=shape, *args, **kwargs)
with tf.variable_scope("some_scopename", custom_getter=my_getter):
ref0 = tf.get_variable('block0', [2], initializer=tf.truncated_normal_initializer(mean=10))
ref1 = tf.get_variable('block1', [2], initializer=tf.truncated_normal_initializer(mean=10))
ref2 = tf.get_variable('block2', [2], initializer=tf.truncated_normal_initializer(mean=10))
ref4 = tf.get_variable('foo0', [2], initializer=tf.truncated_normal_initializer(mean=10))
ref5 = tf.get_variable('foo1', [2], initializer=tf.truncated_normal_initializer(mean=10))
block_vars = [v for v in tf.global_variables() if 'block' in v.name]
block_vars_complement = [v for v in tf.global_variables() if 'block' not in v.name]
with tf.Session() as sess:
sess.run(tf.variables_initializer(var_list=block_vars))
print(np.mean(sess.run([ref0, ref1, ref2])), 'should be ~ 40')
try:
print(np.mean(sess.run([ref4])))
except Exception as e:
print('[INFO] failed as expected with message %s' % e)
sess.run(tf.variables_initializer(var_list=block_vars_complement))
print(np.mean(sess.run([ref4, ref5])), 'should be ~ 10')
解决方案 3
tf.truncated_normal_initializer
或其他初始化程序本身只是操作。因此,这些可以循环应用于集合中的所有变量,并且最终可以应用这样的分组更新(请参阅 参考资料initialize_collection
):
import tensorflow as tf
import numpy as np
ref0 = tf.get_variable('block0', [2], initializer=tf.truncated_normal_initializer(mean=40))
ref1 = tf.get_variable('block1', [2], initializer=tf.truncated_normal_initializer(mean=40))
ref2 = tf.get_variable('block2', [2], initializer=tf.truncated_normal_initializer(mean=40))
ref4 = tf.get_variable('foo0', [2], initializer=tf.truncated_normal_initializer(mean=10))
ref5 = tf.get_variable('foo1', [2], initializer=tf.truncated_normal_initializer(mean=10))
block_vars = [v for v in tf.global_variables() if 'block' in v.name]
block_vars_complement = [v for v in tf.global_variables() if 'block' not in v.name]
def initialize_collection(collection, initializer):
ops = []
for v in collection:
ops.append(v.assign(initializer(shape=v.shape)))
return tf.group(ops)
with tf.Session() as sess:
sess.run(tf.variables_initializer(var_list=block_vars))
print(np.mean(sess.run([ref0, ref1, ref2])), 'should be ~ 40')
sess.run(initialize_collection(block_vars, tf.truncated_normal_initializer(mean=-40, stddev=0.01)))
print(np.mean(sess.run([ref0, ref1, ref2])), 'should be ~ -40')
推荐阅读
- junit - 为什么我的一些 Junit 课程没有运行?
- javascript - 当两个条之间的范围内时,我的 p:barChart 中缺少一个条。我用谷歌搜索了很多,请回答我或更新有关此的任何线索
- c++ - std::filesystem::relative() 在 Windows 上部分现有路径上的行为不正确
- python - 如何在 Python 中从 Windows 句柄加载图像
- react-native - 错误消息:任务:app:installDebug FAILED
- php - 使用 php ajax 来自不同输入字段的多个图像
- flutter - 如何将编码的结果重写为字符串表示?
- function - 查找不同大小的函数之间的相关性
- java - 简化 java 正则表达式代码以验证密码
- python - 为什么这种类型的 PySpark isin 映射不起作用