python – 在内存中序列化和反序列化Tensorflow模型并继续训练
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – 在内存中序列化和反序列化Tensorflow模型并继续训练,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3168字,纯文字阅读大概需要5分钟。
内容图文
我已经看到了这个问题的变化,但我还没有找到满意的答案.基本上,我想从keras model.to_json(),model.get_weights(),model.from_json(),model.set_weights()到tensorflow等效.我想我已经接近那里了,但我正处于被困的地步.如果我能在相同的字符串中获得权重和图表,我更愿意,但我明白这是不可能的.
目前,我所拥有的是:
g = optimizer.minimize(loss_op,
global_step=tf.train.get_global_step())
de = g.graph.as_graph_def()
json_string = json_format.MessageToJson(de)
gd = tf.GraphDef()
gd = json_format.Parse(json_string, gd)
这似乎创建了图表,但显然元图不包含在变量,权重等中.还有元图,但我唯一看到的是export_meta_graph,它似乎没有以相同的方式序列化.我看到MetaGraph有一个proto函数,但我不知道如何序列化这些变量.
简而言之,您如何采用张量流模型(模型如权重,图形等),将其序列化为字符串(最好是json),然后对其进行反序列化并继续训练或提供预测.
以下是让我接近并且我已经尝试过的东西,但是大多数都需要写入磁盘的限制,在这种情况下我无法做到:
This is the closest one I found, but the link to serializing a metagraph doesn’t exist.
解决方法:
如果你想要相当于keras Model.get_weights()和Model.set_weights(),这些方法与keras内部结构并没有很强的联系,可以很容易地提取出来.
原始代码
以下是keras源代码中的外观:
def get_weights(self):
weights = []
for layer in self.layers:
weights += layer.weights
return K.batch_get_value(weights) # this is just `get_session().run(weights)`
def set_weights(self, weights):
tuples = []
for layer in self.layers:
num_param = len(layer.weights)
layer_weights = weights[:num_param]
for sw, w in zip(layer.weights, layer_weights):
tuples.append((sw, w))
weights = weights[num_param:]
K.batch_set_value(tuples) # another wrapper over `get_session().run(...)`
Keras的权重是numpy数组(不是json)的列表.如您所见,它使用模型体系结构已知的事实(self.layers),它允许它重建从变量到值的正确映射.一些看似非平凡的工作是在K.batch_set_value完成的,但实际上它只是准备分配操作并在会话中运行它们.
在纯张量流中获取和设置权重
def tensorflow_get_weights():
vars = tf.trainable_variables()
values = tf.get_default_session().run(vars)
return zip([var.name for var in vars], values)
def tensorflow_set_weights(weights):
assign_ops = []
feed_dict = {}
for var_name, value in weights:
var = tf.get_default_session().graph.get_tensor_by_name(var_name)
value = np.asarray(value)
assign_placeholder = tf.placeholder(var.dtype, shape=value.shape)
assign_op = tf.assign(var, assign_placeholder)
assign_ops.append(assign_op)
feed_dict[assign_placeholder] = value
tf.get_default_session().run(assign_ops, feed_dict=feed_dict)
在这里,我假设您要序列化/反序列化整个模型(即所有可训练的变量)和默认会话.如果不是这种情况,上述功能很容易定制.
测试
x = tf.placeholder(shape=[None, 5], dtype=tf.float32, name='x')
W = tf.Variable(np.zeros([5, 5]), dtype=tf.float32, name='W')
b = tf.Variable(np.zeros([5]), dtype=tf.float32, name='b')
y = tf.add(tf.matmul(x, W), b)
with tf.Session() as session:
session.run(tf.global_variables_initializer())
# Save the weights
w = tensorflow_get_weights()
print(W.eval(), b.eval())
# Update the model
session.run([tf.assign(W, np.ones([5, 5])), tf.assign(b, np.ones([5]) * 2)])
print(W.eval(), b.eval())
# Restore the weights
tensorflow_set_weights(w)
print(W.eval(), b.eval())
如果运行此测试,您应该看到模型在零处冻结,然后更新,然后恢复为零.
内容总结
以上是互联网集市为您收集整理的python – 在内存中序列化和反序列化Tensorflow模型并继续训练全部内容,希望文章能够帮你解决python – 在内存中序列化和反序列化Tensorflow模型并继续训练所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。