如何构建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")
def predict(self):
return self.logits
def make_prediction(self, query):
result = None
with tf.Session() as sess:
saver = tf.train.import_meta_graph('saved_models/testing.meta')
saver.restore(sess, 'saved_models/testing')
sess.run(tf.global_variables_initializer())
prediction = self.predict()
prediction = sess.run(prediction, feed_dict={self.x : query})
prediction = prediction.tolist()
prediction = tf.nn.softmax(prediction)
prediction = sess.run(prediction)
print prediction
return utils.get_label_from_encoding(prediction[0])
def train(self, data):
print len(data['values'])
print len(data['labels'])
prediction = self.predict()
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=prediction, labels=self.y))
optimizer = tf.train.AdamOptimizer().minimize(cost)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
writer = tf.summary.FileWriter("mygraph/logs", tf.get_default_graph())
for epoch in range(self.num_of_epoch):
optimised, loss = sess.run([optimizer, cost],
feed_dict={self.x: data['values'], self.y: data['labels']})
if epoch % 1 == 0:
print("Completed Training Cycle: " + str(epoch) + " out of " + str(self.num_of_epoch))
print("Current Loss: " + str(loss))
saver = tf.train.Saver()
saver.save(sess, 'saved_models/testing')
print("Model saved")

我在网上发现的是,许多人使用低得多的代码,例如tf。变量tf。因此,他们更能够拆分代码。但是,由于我对Tensorflow相对较新,因此我想先使用更高级别的代码。

谁能建议我如何构建我的代码?

如前所述,对您最初问题的简短回答是阅读本文,但是当您在评论中提出后续问题时,我认为它需要一个更完整的答案。


谁能建议我如何构建我的代码?

显然,构建代码是一个品味问题。但是,为了帮助您制作自己的口味,您需要记住的主要事情是:TensorFlow 中有 2 个不同的层,不要混淆它们。

  • 第一个是Graph层,它包含所有TensorFlow节点,例如
    • tensors(例如tf.placeholdertf.constanttf.Variables等(,或
    • operations(tf.addtf.matmul等(。Graph包含您的模型本身,并且可能包含更多内容,例如:损失函数、用于训练模型的优化器、输入数据管道等。

每个节点都有一个名称,您可以使用它直接从图形中检索它(例如,使用tf.get_variable方法或tf.Graph.get_tensor_by_name(。

  • 第二层是使用Python(或C++或Java等(构建TensorFlowGraph的方式。应用程序接口。这可能是您在提问时想到的这一层。但是,在某种程度上,这一层实际上更像是一个模型工厂,而不是一个模型。

格式是否支持保存和恢复模型?

这取决于您对模型的含义,即使在这两种情况下答案都是肯定的。

  • 如果你想到了 TensorFlowGraph,答案是肯定的,你可以保存和恢复你的Graph,因为它不依赖于你如何构建它。只需查看本文档的"保存和还原"部分即可获得有关如何执行此操作的一些见解,或者查看此答案,其中仅还原了Graph
  • 如果你想到Python类,简短的回答是否定的但是你可以编造一些东西来让它成为肯定的。
    如上一项所述,TensorFlow 检查点不会保存 Python(也不保存 C++ 或 Java(对象,而只会保存图形。但是你的模型作为 Python 类的结构存在于其他地方:它存在于你的代码中。

    因此,如果您重新创建 Python 类的实例,并且确保在Graph中重新创建所有 TensorFlow 节点(因此您将获得等效的Graph(,那么,当您从检查点恢复 TensorFlowGraph时,您的模型作为 Python 实例链接到 TensorFlow-Graph将被恢复。

    请参阅文档的恢复变量部分,了解一个简单的示例,其中链接到 TensorFlow-Graph的 Python 实例实际上是位于模块作用域中的某个位置的 Python 变量(即v1v2(。

    # Create some variables.
    v1 = tf.Variable(..., name="v1")
    v2 = tf.Variable(..., name="v2")
    ...
    # Add ops to save and restore all the variables.
    saver = tf.train.Saver()
    # Later, launch the model, use the saver to restore variables from disk, and
    # do some work with the model.
    with tf.Session() as sess:
    # Restore variables from disk.
    saver.restore(sess, "/tmp/model.ckpt")
    print("Model restored.")
    # Do some work with the model
    ...
    

我只能建议阅读(并:)点赞(这个问题及其答案,因为您将在TensorFlow中保存/恢复工作方面学到很多东西。


希望现在更清楚了。

最新更新