我想从头开始训练InceptionV3神经网络。我已经在运行一个使用TensorFlow Hub模块https://tfhub.dev/google/imagenet/inception_v3/feature_vector/1的实现,并利用包含的预训练权重进行微调。
我现在想使用the same TensorFlow Hub module,但放弃提供的权重并使用自己的内核初始化程序(例如tf.initializers.truncated_normal,tf.initializers.he_normal等)。
如何修改TFHub模块中的可训练变量以使用自定义初始化程序?明确地说,我想在运行时替换预先训练的权重,并保留模型架构。请让我知道我是否真的应该使用TFSlim或模型动物园。
这是我到目前为止所拥有的:
import tensorflow as tf
import tensorflow_hub as hub
tfhub_module_url = 'https://tfhub.dev/google/imagenet/inception_v3/feature_vector/1'
initializer = tf.truncated_normal
def main(_):
_graph = tf.Graph()
with _graph.as_default():
module_spec = hub.load_module_spec(tfhub_module_url)
height, width = hub.get_expected_image_size(module_spec)
resized_input_tensor = tf.placeholder(tf.float32, [None, height, width, 3], name='resized_input_tensor')
m = hub.Module(module_spec, trainable=True)
bottleneck_tensor = m(resized_input_tensor)
trainable_vars = tf.trainable_variables()
# TODO: This fails, because this probably isn't how this is supposed to be done:
for trainable_var in trainable_vars:
trainable_var.initializer = tf.initializers.he_normal
with tf.Session(graph=_graph) as sess:
print(trainable_vars)
tf.logging.set_verbosity(tf.logging.INFO)
tf.app.run()
正确的方法是什么?
答案 0 :(得分:1)
没有简单的方法可以完成您想做的事情,因为TF Hub模块实际上是为表示预先训练的模型而构建的。如果只需要图,则可以直接使用tensorflow_models / slim代码。 (或者,您可以修补tensorflow_hub库代码,以免首先用restore ops重新连接变量初始化程序。)
编辑2019-04-15:另请参见tensorflow_hub issue #267:在TF2中,初始化程序的概念已消失,因此TF Hub作者不想开始依赖于TF1 API。