这两个代码有什么区别吗?

无聊的

我目前对 Tensorflow 还比较陌生。我在处理这两段代码时遇到了一些麻烦。

代码 A:

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")

代码 B:

self.hidden_1_layer = {
    'weights': tf.Variable(tf.random_normal([self.num_of_words, self.h1])),
    'biases' : tf.Variable(tf.random_normal([self.h1]))
}

self.hidden_2_layer = {
    'weights': tf.Variable(tf.random_normal([self.h1, self.h2])),
    'biases' : tf.Variable(tf.random_normal([self.h2]))
}

self.hidden_3_layer = {
    'weights': tf.Variable(tf.random_normal([self.h2, self.h3])),
    'biases' : tf.Variable(tf.random_normal([self.h3]))
}

self.final_output_layer = {
    'weights': tf.Variable(tf.random_normal([self.h3, self.num_of_classes])),
    'biases' : tf.Variable(tf.random_normal([self.num_of_classes]))
}

layer1 = tf.add(tf.matmul(data, self.hidden_1_layer['weights']), self.hidden_1_layer['biases'])
layer1 = tf.nn.relu(layer1)

layer2 = tf.add(tf.matmul(layer1, self.hidden_2_layer['weights']), self.hidden_2_layer['biases'])
layer2 = tf.nn.relu(layer2)

layer3 = tf.add(tf.matmul(layer2, self.hidden_3_layer['weights']), self.hidden_3_layer['biases'])
layer3 = tf.nn.relu(layer3)

output = tf.matmul(layer3, self.final_output_layer['weights']) + self.final_output_layer['biases']

它们是一样的吗?可以使用 tf.train.Saver() 保存代码 A 和 B 的权重和偏差吗?

谢谢

编辑:我在使用代码 A 生成预测时遇到问题。代码 A 的 logits 似乎总是在变化。

完整代码:

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:
            sess.run(tf.global_variables_initializer())

            saver = tf.train.import_meta_graph('saved_models/testing.meta')
            saver.restore(sess, 'saved_models/testing')

            # for variable in tf.trainable_variables():
            #     print sess.run(variable)

            prediction = self.predict()
            pre, prediction = sess.run([self.logits, prediction], feed_dict={self.x : query})
            print pre
            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):
        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")
杰克钦

TLDR : 操作基本相同,但变量创建初始化方法不同。

如果您从此处跟踪代码,您最终将进入代码调用tf.get_variable以初始化变量的阶段。在上面的示例中,由于kernel_initializerbias_initializer未设置,它们将分别默认为Nonetf.zeros_initializer()请参阅 Dense API)。作为初始化器None传递给时tf.get_variableglorot_uniform_initializer将使用 a:

如果初始值设定项是 None (默认值),则将使用在变量作用域中传递的默认初始值设定项。如果那个也是 None ,一个 glorot_uniform_initializer 将被使用。初始化器也可以是一个张量,在这种情况下,变量被初始化为这个值和形状。

可以在此处找到有关 tf.get_variable 的更多信息

在一种情况下,您tf.random_normal对内核权重和偏置权重都使用了初始化程序,但在另一种情况下,您使用了tf.layers.dense并且将导致glorot_uniform_initializer内核权重和zeros_initializer偏置权重为 ,因为没有参数传递给tf.layers.dense

关于他们是否可以保存的第二个问题,是的,可以。

最后要注意的是,使用时必须小心,tf.Variable因为如果范围设置不正确,它可能会使事情复杂化。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章