我正在使用tensorflow存储库的image_retraining文件夹中提供的重新训练脚本。
其中一个解析器参数/标志允许您每X步执行中间图
parser.add_argument(
'--intermediate_output_graphs_dir',
type=str,
default='tf_files2/tmp/intermediate_graph/',
help='Where to save the intermediate graphs.'
但是,这似乎将图形存储为扩展名为.pb的冻结图形。 关于如何正确加载.pb文件以继续培训的信息非常少。 我发现的大多数信息都使用.meta图和.ckpts。 .pb会被弃用吗?
如果是这样,我应该从开始重新训练模型并使用tf.Saver来获取 .meta和ckpt图表作为中间检查点?
昨天,我正在训练一个模型,由于某种原因训练冻结,所以我想加载中间图,并继续训练。
我正在使用初始模型进行再培训:
https://github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/image_retraining/retrain.py
如果有人可以指点我或告诉我如何正确加载.pb中间图(一步一步)并从我离开的地方继续 - 我会非常感激。
谢谢。
编辑:
@Mingxing
所以我假设我应该让retrain.py首先根据默认的初始模型创建默认图形(下面的这个函数),然后用加载的图形覆盖它?
def create_model_graph(model_info):
""""Creates a graph from saved GraphDef file and returns a Graph object.
Args:
model_info: Dictionary containing information about the model architecture.
Returns:
Graph holding the trained Inception network, and various tensors we'll be
manipulating.
"""
with tf.Graph().as_default() as graph:
model_path = os.path.join(FLAGS.model_dir, model_info['model_file_name'])
with gfile.FastGFile(model_path, 'rb') as f:
graph_def = tf.GraphDef()
graph_def.ParseFromString(f.read())
bottleneck_tensor, resized_input_tensor = (tf.import_graph_def(
graph_def,
name='',
return_elements=[
model_info['bottleneck_tensor_name'],
model_info['resized_input_tensor_name'],
]))
return graph, bottleneck_tensor, resized_input_tensor
EDIT_2:
我得到的错误是:
ValueError: Tensor("second_to_final_fC_layer_ops/weights/final_weights_1:0", shape=(2048, 102
4), dtype=float32_ref) must be from the same graph as Tensor("BottleneckInputPlaceholder:0",
shape=(?, 2048), dtype=float32).
我在第一个FC层之后添加了一个额外的FC层。 所以2048 - > 1024 - >转换之前的类数。
在训练模型时我没有遇到任何问题,但现在加载图表我似乎遇到了上述错误。
这是添加的图层的外观:
layer_name = 'second_to_final_fC_layer_ops'
with tf.name_scope(layer_name):
with tf.name_scope('weights'):
initial_value = tf.truncated_normal(
[bottleneck_tensor_size, 1024], stddev=0.001)
layer_weights = tf.Variable(initial_value, name='weights')
variable_summaries(layer_weights)
with tf.name_scope('biases'):
layer_biases = tf.Variable(tf.zeros([1024]), name='biases')
variable_summaries(layer_biases)
with tf.name_scope('Wx_plus_b'):
logits = tf.matmul(bottleneck_input, layer_weights) + layer_biases
tf.summary.histogram('pre_activations', logits)
with tf.name_scope('Relu_activation'):
relu_activated =tf.nn.relu(logits, name= 'Relu')
tf.summary.histogram('final_relu_activation', relu_activated)
然后是最后一层(原始的最后一层,但现在输入是最后一层的输出而不是瓶颈张量):
layer_name = 'final_training_ops'
with tf.name_scope(layer_name):
with tf.name_scope('weights'):
initial_value = tf.truncated_normal(
[1024, class_count], stddev=0.001)
layer_weights = tf.Variable(initial_value, name='final_weights')
variable_summaries(layer_weights)
with tf.name_scope('biases'):
layer_biases = tf.Variable(tf.zeros([class_count]), name='final_biases')
variable_summaries(layer_biases)
with tf.name_scope('Wx_plus_b'):
logits = tf.matmul(relu_activated, layer_weights) + layer_biases
tf.summary.histogram('pre_activations', logits)
final_tensor = tf.nn.softmax(logits, name=final_tensor_name)
tf.summary.histogram('activations', final_tensor)
编辑:仍然不知道如何加载权重 - 加载图形结构似乎很容易,但我不知道如何加载使用传输再次训练过的Inception的权重和输入学习。
使用image_retraining / retrain.py中的权重和变量的一个明显示例将非常有用。谢谢。
答案 0 :(得分:1)
您可以使用tf.import_graph_def导入冻结的.pb文件:
# Read the .pb file into graph_def.
with tf.gfile.GFile(FLAGS.graph, "rb") as f:
graph_def = tf.GraphDef()
graph_def.ParseFromString(f.read())
# Restore the graph.
with tf.Graph().as_default() as graph:
tf.import_graph_def(graph_def, name="")
# After this, graph is the what you need.
虽然直接使用冻结.pb文件没有任何问题,但我仍然想指出建议的方法是遵循标准保存/恢复(official doc)。