如何使用tensorflow将预训练模型特定层参数直接赋值给当前网络层?
- 内容介绍
- 文章标签
- 相关推荐
本文共计451个文字,预计阅读时间需要2分钟。
已经存在了一个预训练的模型,需要从中提取某一层的weights和biases值,并将它们赋值到新的网络结构中。可以使用TensorFlow中的pywrap_tensorflow(用于读取预训练模型的参数)结合Session来操作:
pythonimport tensorflow as tf
加载预训练模型model=tf.keras.models.load_model('pretrained_model.h5')
获取目标层的weights和biasestarget_layer=model.layers['target_layer_name']weights=target_layer.get_weights()[0]biases=target_layer.get_weights()[1]
创建新的网络结构new_model=tf.keras.models.Sequential([ # ... 其他层 ... tf.keras.layers.Dense(units=weights.shape[1], kernel_initializer=tf.constant_initializer(weights), bias_initializer=tf.constant_initializer(biases)), # ... 其他层 ...])
使用Session赋值with tf.compat.v1.Session() as sess: sess.run(tf.compat.v1.global_variables_initializer()) sess.run(new_model.layers[-1].weights.assign(weights)) sess.run(new_model.layers[-1].biases.assign(biases))
已经有了一个预训练的模型,我需要从其中取出某一层,把该层的weights和biases赋值到新的网络结构中,可以使用tensorflow中的pywrap_tensorflow(用来读取预训练模型的参数值)结合Session.assign()进行操作。
这种需求即预训练模型可能为单分支网络,当前网络为多分支,我需要把单分支A复用到到多个分支去(B,C,D)。
先导入对应的工具包
from tensorflow.python import pywrap_tensorflow
接下来的操作在一个tf.Session中进行
reader = pywrap_tensorflow.NewCheckpointReader(pre_train_model_path) # 获取当前图可训练变量 trainable_variables = tf.trainable_variables() # 需要赋值的当前网络层变量,这里只是随便起的名字。 restore_v_target_name = "fc_target" # 需要的预训练模型中的某层的名字 restore_v_source_name = "fc_source" for v in trainable_variables: if restore_v_target_name == v.name: # 回复weights和biases sess.run( tf.assign(v, reader.get_tensor(restore_v_source_name + "/weights"))) if "weights" in v.name else sess.run( tf.assign(v, reader.get_tensor(restore_v_source_name + "/biases")))
以上这篇tensorflow获取预训练模型某层参数并赋值到当前网络指定层方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持易盾网络。
本文共计451个文字,预计阅读时间需要2分钟。
已经存在了一个预训练的模型,需要从中提取某一层的weights和biases值,并将它们赋值到新的网络结构中。可以使用TensorFlow中的pywrap_tensorflow(用于读取预训练模型的参数)结合Session来操作:
pythonimport tensorflow as tf
加载预训练模型model=tf.keras.models.load_model('pretrained_model.h5')
获取目标层的weights和biasestarget_layer=model.layers['target_layer_name']weights=target_layer.get_weights()[0]biases=target_layer.get_weights()[1]
创建新的网络结构new_model=tf.keras.models.Sequential([ # ... 其他层 ... tf.keras.layers.Dense(units=weights.shape[1], kernel_initializer=tf.constant_initializer(weights), bias_initializer=tf.constant_initializer(biases)), # ... 其他层 ...])
使用Session赋值with tf.compat.v1.Session() as sess: sess.run(tf.compat.v1.global_variables_initializer()) sess.run(new_model.layers[-1].weights.assign(weights)) sess.run(new_model.layers[-1].biases.assign(biases))
已经有了一个预训练的模型,我需要从其中取出某一层,把该层的weights和biases赋值到新的网络结构中,可以使用tensorflow中的pywrap_tensorflow(用来读取预训练模型的参数值)结合Session.assign()进行操作。
这种需求即预训练模型可能为单分支网络,当前网络为多分支,我需要把单分支A复用到到多个分支去(B,C,D)。
先导入对应的工具包
from tensorflow.python import pywrap_tensorflow
接下来的操作在一个tf.Session中进行
reader = pywrap_tensorflow.NewCheckpointReader(pre_train_model_path) # 获取当前图可训练变量 trainable_variables = tf.trainable_variables() # 需要赋值的当前网络层变量,这里只是随便起的名字。 restore_v_target_name = "fc_target" # 需要的预训练模型中的某层的名字 restore_v_source_name = "fc_source" for v in trainable_variables: if restore_v_target_name == v.name: # 回复weights和biases sess.run( tf.assign(v, reader.get_tensor(restore_v_source_name + "/weights"))) if "weights" in v.name else sess.run( tf.assign(v, reader.get_tensor(restore_v_source_name + "/biases")))
以上这篇tensorflow获取预训练模型某层参数并赋值到当前网络指定层方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持易盾网络。

