我认为如果有针对CIFAR-10教程中由convnet创建的模型测试单个新图像的关键任务的详细解决方案,那么Tensorflow社区将会非常有用.
我可能错了,但是这个让训练有素的模型在实践中可用的关键步骤似乎缺乏.该教程中有一个"缺失的链接" - 一个直接加载单个图像(作为数组或二进制文件)的脚本,将其与训练模型进行比较,然后返回分类.
先前的答案提供了解释整体方法的部分解决方案,但我没有能够成功实施.其他零碎可以在这里和那里找到,但遗憾的是还没有添加到一个可行的解决方案.在将此标记为重复或已经回答之前,请考虑我已完成的研究.
https://gist.github.com/nikitakit/6ef3b72be67b86cb7868
最流行的答案是第一个,其中@RyanSepassi和@YaroslavBulatov描述了问题和方法:人们需要"手动构建具有相同节点名称的图形,并使用Saver将权重加载到其中".虽然这两个答案都很有帮助,但是如何将其插入CIFAR-10项目并不明显.
一个功能齐全的解决方案非常需要,因此我们可以将其移植到其他单个图像分类问题中.在这方面SO有几个问题要求这个,但仍然没有完整的答案(例如加载检查点并评估具有张量流DNN的单个图像).
我希望我们能够集中在每个人都可以使用的工作脚本上.
以下脚本尚未正常运行,我很高兴听到您如何改进,以便使用CIFAR-10 TF教程训练模型为单图像分类提供解决方案.
假设所有变量,文件名等都不受原始教程的影响.
新文件:cifar10_eval_single.py
import cv2
import tensorflow as tf
FLAGS = tf.app.flags.FLAGS
tf.app.flags.DEFINE_string('eval_dir', './input/eval',
"""Directory where to write event logs.""")
tf.app.flags.DEFINE_string('checkpoint_dir', './input/train',
"""Directory where to read model checkpoints.""")
def get_single_img():
file_path = './input/data/single/test_image.tif'
pixels = cv2.imread(file_path, 0)
return pixels
def eval_single_img():
# below code adapted from @RyanSepassi, however not functional
# among other errors, saver throws an error that …Run Code Online (Sandbox Code Playgroud) 我有一些关于SavedModelAPI的问题,我找到的文档留下了很多细节无法解释.
前三个问题是关于什么传递给add_meta_graph_and_variables()方法的论据tf.saved_model.builder.SavedModelBuilder,而第四个问题是关于为什么要使用SavedModelAPI tf.train.Saver.
signature_def_map参数的格式是什么?保存模型时,我通常需要设置此参数吗?
同样,assets_collection论证的格式是什么?
为什么要保存带有元图的标签列表而不是只给它一个名字(即只附加一个唯一标签)?为什么我要为给定的元图添加多个标签?如果我尝试从pb某个标签加载metagrpah ,但是那个pb匹配该标签的多个元图怎么办?
该文档认为,建议用于SavedModel在自包含文件中保存整个模型(而不仅仅是变量).但tf.train.Saver除了.meta文件中的变量外,还会保存图形.那么使用有什么好处SavedModel?文件说
当您想要保存和加载变量,图形和图形的元数据时 - 基本上,当您想要保存或恢复模型时 - 我们建议使用SavedModel.SavedModel是一种语言中立的,可恢复的,密集的序列化格式.SavedModel支持更高级别的系统和工具来生成,使用和转换TensorFlow模型.
但这个解释很抽象,并没有真正帮助我理解它的优点SavedModel.什么是具体的例子SavedModel(相对于tf.train.Saver)会更好用?
请注意,我的问题与此问题不重复.我不是在问如何保存模型,我问的是关于属性的非常具体的问题SavedModel,这只是TensorFlow为保存和加载模型提供的多种机制之一.链接问题中的所有答案都没有触及SavedModelAPI(再次,它不同于tf.train.Saver).
要将训练有素的网络导入C++,您需要导出网络才能执行此操作.经过大量搜索并几乎找不到有关它的信息后,我们明白应该使用freeze_graph()来做到这一点.
感谢Tensorflow的新0.7版本,他们添加了它的文档.
在查看文档之后,我发现几乎没有类似的方法,你能说出freeze_graph()和之间有什么区别:
tf.train.export_meta_graph因为它有类似的参数,但它似乎也可以用于将模型导入C++(我只是猜测区别是对于使用此方法输出的文件,您只能使用import_graph_def()或其他东西?)
还包括如何使用一个问题write_graph():在相关文件中体现graph_def由下式给出sess.graph_def,但例子freeze_graph()是sess.graph.as_graph_def().这两者有什么区别?
这个问题与这个问题有关.
谢谢!
我正在尝试恢复TensorFlow模型.我按照这个例子:http: //nasdag.github.io/blog/2016/01/19/classifying-bees-with-google-tensorflow/
在示例代码的末尾,我添加了以下行:
saver = tf.train.Saver()
save_path = saver.save(sess, "model.ckpt")
print("Model saved in file: %s" % save_path)
Run Code Online (Sandbox Code Playgroud)
创建了两个文件:checkpoint和model.ckpt.
在一个新的python文件(tomas_bees_predict.py)中,我有这个代码:
import tensorflow as tf
saver = tf.train.Saver()
with tf.Session() as sess:
# Restore variables from disk.
saver.restore(sess, "model.ckpt")
print("Model restored.")
Run Code Online (Sandbox Code Playgroud)
但是,当我执行代码时,我收到此错误:
Traceback (most recent call last):
File "tomas_bees_predict.py", line 3, in <module>
saver = tf.train.Saver()
File "/usr/local/lib/python2.7/site-packages/tensorflow/python/training/saver.py", line 705, in __init__
raise ValueError("No variables to save")
Run Code Online (Sandbox Code Playgroud)
ValueError:没有要保存的变量
有没有办法读取mode.ckpt文件,看看保存了哪些变量?或者有人可以帮助保存模型并根据上述示例进行恢复?
编辑1:
我想我尝试运行相同的代码,以重新创建模型结构,我收到了错误.我认为这可能与这里描述的代码没有使用命名变量的事实有关:http: //nasdag.github.io/blog/2016/01/19/classifying-bees-with-google-tensorflow/
def weight_variable(shape):
initial = tf.truncated_normal(shape, stddev=0.1) …Run Code Online (Sandbox Code Playgroud) 我正试图通过拾取TensorFlow中的模型训练来重新开始.我想使用最近添加的(0.12 +我认为)import_meta_graph(),以便不重建图形.
我见过这方面的解决方案,例如Tensorflow:如何保存/恢复模型?,但是我遇到了AdamOptimizer的问题,特别是我得到了一个ValueError: cannot add op with name <my weights variable name>/Adam as that name is already used错误.这可以通过初始化来修复,但我的模型值会被清除!
还有其他答案和一些完整的例子,但它们似乎总是较旧,因此不包括较新的import_meta_graph()方法,或者没有非张量优化器.我能找到的最接近的问题是tensorflow:保存和恢复会话,但没有最终的明确解决方案,这个例子非常复杂.
理想情况下,我想要一个简单的可运行示例从头开始,停止,然后再次拾起.我有一些有用的东西(下图),但也想知道我是否遗漏了什么.当然,我不是唯一一个这样做的人吗?
问题:
Tensorflow Saver,Exporter,SavedModelBuilder都可以用于保存模型.根据 /sf/ask/2921807101/和张量流服务,我知道Saver用于保存训练检查点和Exporter和SavedModelBuilder用于服务.
但是,我不知道他们的产出的差异.是变量.data - ??? - of - ??? 和SavedModelBuilder生成的variable.index文件与cpkt-xxx.index和cpkt-xxx.data相同 - ??? - of - ??? Saver生成的?
我仍然对tensorflow的模型文件的含义感到困惑.我读过http://cv-tricks.com/tensorflow-tutorial/save-restore-tensorflow-models-quick-complete-tutorial/和Tensorflow:如何保存/恢复模式?这让我感到更加困惑.
模型目录中有4个文件:
文件2和4存储变量的权重.文件3存储图表.然后1商店是什么?
如何将Saver的输出转换为SavedModelBuilder.我有检查点目录,并希望导出模型以进行服务.根据https://github.com/tensorflow/tensorflow/tree/master/tensorflow/python/saved_model
它应该是这样的
export_dir = ...
...
builder = tf.saved_model.builder.SavedModelBuilder(export_dir)
with tf.Session(graph=tf.Graph()) as sess:
...
builder.add_meta_graph_and_variables(sess,
[tf.saved_model.tag_constants.TRAINING],
signature_def_map=foo_signatures,
assets_collection=foo_assets)
...
with tf.Session(graph=tf.Graph()) as sess:
...
builder.add_meta_graph(["bar-tag", "baz-tag"])
...
builder.save()
Run Code Online (Sandbox Code Playgroud)
所以,我首先需要加载检查点:
saver = tf.train.import_meta_graph('model-number.meta')
saver.restore(sess, tf.train.latest_checkpoint('./'))
Run Code Online (Sandbox Code Playgroud)
然后将其sess用于构建器.
我对吗?
我试图从答案中实现一个建议: Tensorflow:如何保存/恢复模型?
我有一个对象,它tensorflow以一种sklearn风格包装模型.
import tensorflow as tf
class tflasso():
saver = tf.train.Saver()
def __init__(self,
learning_rate = 2e-2,
training_epochs = 5000,
display_step = 50,
BATCH_SIZE = 100,
ALPHA = 1e-5,
checkpoint_dir = "./",
):
...
def _create_network(self):
...
def _load_(self, sess, checkpoint_dir = None):
if checkpoint_dir:
self.checkpoint_dir = checkpoint_dir
print("loading a session")
ckpt = tf.train.get_checkpoint_state(self.checkpoint_dir)
if ckpt and ckpt.model_checkpoint_path:
self.saver.restore(sess, ckpt.model_checkpoint_path)
else:
raise Exception("no checkpoint found")
return
def fit(self, train_X, train_Y , load = True):
self.X = …Run Code Online (Sandbox Code Playgroud) 我正在用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 eager模式下训练了CNN模型.现在我正在尝试从检查点文件恢复训练模型,但没有取得任何成功.
我发现的所有示例(如下所示)都在讨论将检查点恢复到会话.但我需要的是将模型恢复到急切模式,即不创建会话.
with tf.Session() as sess:
# Restore variables from disk.
saver.restore(sess, "/tmp/model.ckpt")
Run Code Online (Sandbox Code Playgroud)
基本上我需要的是:
tfe.enable_eager_execution()
model = tfe.restore('model.ckpt')
model.predict(...)
Run Code Online (Sandbox Code Playgroud)
然后我可以使用该模型进行预测.
有人可以帮忙吗?
更新
示例代码可以在以下位置找到:mnist eager mode demo
我试图按照@Jay Shah的回答中的步骤进行操作,它几乎可以工作,但恢复的模型中没有任何变量.
tfe.save_network_checkpoint(model,'./test/my_model.ckpt')
Out[58]:
'./test/my_model.ckpt-1720'
model2 = MNISTModel()
tfe.restore_network_checkpoint(model2,'./test/my_model.ckpt-1720')
model2.variables
Out[72]:
[]
Run Code Online (Sandbox Code Playgroud)
原始模型中有很多变量:
model.variables
[<tf.Variable 'mnist_model_1/conv2d/kernel:0' shape=(5, 5, 1, 32) dtype=float32, numpy=
array([[[[ -8.25184360e-02, 6.77833706e-03, 6.97569922e-02,...
Run Code Online (Sandbox Code Playgroud) 我有一个我构建的 TensorFlow 模型(一个 1D CNN),我现在想将其实现到 .NET 中。
为此,我需要知道输入和输出节点。
当我将模型上传到Netron 时,根据我的保存方法,我得到了一个不同的图表,唯一看起来正确的图表来自 h5 上传。这是model.summary():
如果我将模型保存为 h5model.save("Mn_pb_model.h5")并将其加载到 Netron 中以绘制图形,一切看起来都是正确的:
但是,ML.NET 不接受 h5 格式,因此需要将其保存为 pb。
在查看在 ML.NET 中采用 TensorFlow 的示例时,该示例显示了一个 TensorFlow 模型,该模型以与SavedModel格式类似的格式保存- 由 TensorFlow 推荐(同时也是 ML.NET在此处推荐的“下载未冻结的 [SavedModel 格式] ……”)。但是,当将 pb 文件保存并加载到 Netron 时,我得到了这个:
再放大一点(在最右边),
正如你所看到的,它看起来不像它应该的那样。
此外,输入节点和输出节点不正确,因此它不适用于 ML.NET(我认为有些问题)。
我使用TensorFlow推荐的方法来确定输入/输出节点:
当我尝试获取冻结图并将其加载到 Netron 时,起初它看起来是正确的,但我不认为它是:
有四个原因我认为这是不正确的。