我正在用TensorFlow进行一些实验,并遇到了障碍.我正在尝试使用TF来评估模型中的变化,然后根据损失函数的结果变化保留或恢复模型.我已经找到了困难的部分(条件控制),但我坚持一些应该相当简单的事情:我似乎无法存储一个tf.trainable_variables迭代,然后在需要时恢复它.
让我们说一个构建一个Op:
...
store_trainable_vars = []
for v in tf.trainable_variables():
store_trainable_vars.append(v)
...
Run Code Online (Sandbox Code Playgroud)
然后,我想恢复tf.trainable_variables到上次运行此操作时的值.我想做的事情如下:
def reject_move():
revert_state = []
for (v, s) in zip(tf.trainable_variables(), store_trainable_vars):
revert_state.append(tf.assign(v, s, name="revert_state"))
return(revert_state)
Run Code Online (Sandbox Code Playgroud)
显然,这将重新评估store_trainable_vars,这反过来又与现在的价值相关联tf.trainable_variables(),从而避免了revert_stateOp.我需要一些方法来存储和检索Tensors的值,而不回调那些Tensors的现值.就像是
...
store_trainable_vars = []
for v in tf.trainable_variables():
store_trainable_vars.append(v.value_right_now())
...
Run Code Online (Sandbox Code Playgroud)
其中v.value_right_now()返回一个在被覆盖之前不会改变的常量.
我知道我可以使用Saver,但是该解决方案会写入磁盘,这对于此应用程序是不可接受的,因为它将在训练循环内运行.
我可能错过了一些明显的东西 - 任何指导都会受到赞赏.
我有一个 Tensorflow 文件,AlexNet.pb我正在尝试加载它,然后对我拥有的图像进行分类。我已经搜索了几个小时,但我仍然找不到加载它然后对图像进行分类的方法。是不是太明显了,我只是太愚蠢了,因为似乎没有人有加载和运行 .pb 文件的简单示例。
我知道堆栈和github等上有无数关于如何在Tensorflow中恢复训练模型的问题.我已阅读大部分(1,2,3).
我有几乎完全相同的问题3然而我想尽可能以不同的方式解决它,因为我的训练和我的测试需要在从shell调用的单独脚本中,我不想添加完全相同的行我用于在测试脚本中定义图形,因此我不能使用tensorflow FLAGS和其他基于手动重新运行图形的答案.
我也不想sess.run每个变量并手动映射它们,因为它解释为我的图表非常大(使用带有参数input_map的import_graph_def).
所以我运行一些图表并在特定的脚本中训练它.比如(但没有培训部分)
#Script 1
import tensorflow as tf
import cPickle as pickle
x=tf.Variable(42)
saver=tf.train.Saver()
sess=tf.Session()
#Saving the graph
graph_def=sess.graph_def
with open('graph.pkl','wb') as output:
pickle.dump(graph_def,output,HIGHEST_PROTOCOL)
#Training the model
sess.run(tf.initialize_all_variables())
#Saving the variables
saver.save(sess,"pretrained_model.ckpt")
Run Code Online (Sandbox Code Playgroud)
我现在已经保存了图形和变量,所以我应该能够从另一个脚本运行我的测试模型,即使我的图形中有额外的训练节点.
#Script 2
import tensorflow as tf
import cPickle as pickle
sess=tf.Session()
with open('graph.pkl','rb') as input:
graph_def=pickle.load(input)
tf.import_graph_def(graph_def,name='persisted')
Run Code Online (Sandbox Code Playgroud)
然后显然我想使用保护程序恢复变量,但我遇到了与3相同的问题,因为没有找到保存甚至创建保护程序的变量.所以我写不出来:
saver=tf.train.Saver()
saver.restore(sess,"pretrained_model.ckpt")
Run Code Online (Sandbox Code Playgroud)
有没有办法绕过这些限制,我认为通过导入图形它会恢复每个节点中未初始化的变量,但似乎不是我真的需要第二次重新运行它像大多数给出的答案?
我想使用我的神经网络而不再训练网络.我读到了
save_path = saver.save(sess, "model.ckpt")
print("Model saved in file: %s" % save_path)
Run Code Online (Sandbox Code Playgroud)
现在我把文件夹中的3个文件:checkpoint,model.ckpt,和model.ckpt.meta
我希望,在python的另一个类中恢复数据,获得我的神经网络的权重并进行单一预测.
我怎样才能做到这一点?
重新培训与Tensorflow.js一起使用的MobileNet的几种方法对我来说都是失败的。有没有办法在Tensorflow.js中使用重新训练的模型?
使用现代的,基于中心的教程以及使用两者retrain.py似乎都失败了。
以及其他一些未解决的问题
另外两个最重要的问题显示了在两种情况下均失败的代码,均未解决。
目的是加载移动网络,使用自定义数据进行重新训练,然后在Tensorflow.js中使用它。遵循这两个教程似乎都失败了。可以在node.js内部完成吗?还有另一种方法吗?我在哪里犯了错误(或者该软件无法使用经过重新训练的模型)?这怎么工作?
编辑:最新的github问题和另一个问题
我的张量流版本是0.11.我希望在训练后保存图形或保存tensorflow可以加载的其他东西.
我/使用导出和导入MetaGraph
我已经阅读过这篇文章: Tensorflow:如何保存/恢复模型?
我的Save.py文件:
X = tf.placeholder("float", [None, 28, 28, 1], name='X')
Y = tf.placeholder("float", [None, 10], name='Y')
tf.train.Saver()
with tf.Session() as sess:
...run something ...
final_tensor = tf.nn.softmax(py_x, name='final_result')
tf.add_to_collection("final_tensor", final_tensor)
predict_op = tf.argmax(py_x, 1)
tf.add_to_collection("predict_op", predict_op)
saver.save(sess, 'my_project')
Run Code Online (Sandbox Code Playgroud)
然后我运行load.py:
with tf.Session() as sess:
new_saver = tf.train.import_meta_graph('my_project.meta')
new_saver.restore(sess, 'my_project')
predict_op = tf.get_collection("predict_op")[0]
for i in range(2):
test_indices = np.arange(len(teX)) # Get A Test Batch
np.random.shuffle(test_indices)
test_indices = test_indices[0:test_size]
print(i, np.mean(np.argmax(teY[test_indices], axis=1) ==
sess.run(predict_op, feed_dict={"X:0": teX[test_indices],
"p_keep_conv:0": …Run Code Online (Sandbox Code Playgroud) python machine-learning neural-network deep-learning tensorflow
我很难找到如何构建我的Tensorflow模型代码.我想以类的形式构建它以便于将来重用.此外,我目前的结构是凌乱的,张量板图输出内部有多个"模型".
以下是我目前的情况:
import tensorflow as tf
import os
from utils import Utils as utils
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'
class Neural_Network:
# Neural Network Setup
num_of_epoch = 50
n_nodes_hl1 = 500
n_nodes_hl2 = 500
n_nodes_hl3 = 500
def __init__(self):
self.num_of_classes = utils.get_num_of_classes()
self.num_of_words = utils.get_num_of_words()
# placeholders
self.x = tf.placeholder(tf.float32, [None, self.num_of_words])
self.y = tf.placeholder(tf.int32, [None, self.num_of_classes])
with tf.name_scope("model"):
self.h1_layer = tf.layers.dense(self.x, self.n_nodes_hl1, activation=tf.nn.relu, name="h1")
self.h2_layer = tf.layers.dense(self.h1_layer, self.n_nodes_hl2, activation=tf.nn.relu, name="h2")
self.h3_layer = tf.layers.dense(self.h2_layer, self.n_nodes_hl3, activation=tf.nn.relu, name="h3")
self.logits = tf.layers.dense(self.h3_layer, self.num_of_classes, name="output") …Run Code Online (Sandbox Code Playgroud) 我有一个包含模型规范和一些训练和评估模型的方法的课程。我想复制一个经过训练的对象,我尝试过copy.deepcopy()但没有成功。
下面的代码只是一个示例,但我希望它适用于使用以下相同想法的任何模型:
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
import argparse
import sys
import copy
from tensorflow.examples.tutorials.mnist import input_data
import tensorflow as tf
FLAGS = None
class Model():
def __init__(self):
self.x = tf.placeholder(tf.float32, [None, 784])
self.W = tf.Variable(tf.zeros([784, 10]))
self.b = tf.Variable(tf.zeros([10]))
self.y = tf.matmul(self.x, self.W) + self.b
self.y_ = tf.placeholder(tf.float32, [None, 10])
self.cross_entropy = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=self.y_, logits=self.y))
self.train_step = tf.train.GradientDescentOptimizer(0.5).minimize(self.cross_entropy)
def train(self, mnist, sess):
for _ in range(1000):
batch_xs, batch_ys = mnist.train.next_batch(100)
sess.run(self.train_step, …Run Code Online (Sandbox Code Playgroud) 我正在初始化保护程序
self.saver = tf.train.Saver()
Run Code Online (Sandbox Code Playgroud)
在图形构造的末尾。然后我用保存模型
self.saver.save(sess, self.data_batch.params.LOG_DIR + "model", global_step=epoch)
Run Code Online (Sandbox Code Playgroud)
最后,我尝试使用还原它:
with tf.Session(graph=self.graph, config=self.proto_config) as sess:
if restore:
self.saver.restore(sess, "./" + self.data_batch.params.LOG_DIR)
else:
self.init.run()
Run Code Online (Sandbox Code Playgroud)
我的文件夹结构如下所示:
-Main directory
--main
--Logs/
---checkpoint
---events.out.tfevents.1528047461.Ublion18
---model-0.data-00000-of-00001
---model-0.index
---model-0.meta
---params
Run Code Online (Sandbox Code Playgroud)
错误如下:
Caused by op 'save/RestoreV2', defined at:
File "/home/dizzi/Work/PycharmProjects/NLP/HomeWork2/main.py", line 22, in <module>
model.init_graph()
File "/home/dizzi/Work/PycharmProjects/NLP/HomeWork2/Classes/Model.py", line 293, in init_graph
self.saver = tf.train.Saver()
File "/home/dizzi/anaconda3/envs/NLP/lib/python3.6/site-packages/tensorflow/python/training/saver.py", line 1311, in __init__
self.build()
File "/home/dizzi/anaconda3/envs/NLP/lib/python3.6/site-packages/tensorflow/python/training/saver.py", line 1320, in build
self._build(self._filename, build_save=True, build_restore=True)
File "/home/dizzi/anaconda3/envs/NLP/lib/python3.6/site-packages/tensorflow/python/training/saver.py", line 1357, in …Run Code Online (Sandbox Code Playgroud)