2017-06-30 98 views
0

我目前對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的邏輯總是在變化。

的完整代碼:

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

回答

1

TLDR:該操作在本質上是相同的,但變量創建初始化方法是不同的。

如果您跟蹤here的代碼,您最終會進入代碼調用tf.get_variable初始化變量的階段。在上例中,由於未設置kernel_initializerbias_initializer,因此它們將分別默認爲Nonetf.zeros_initializer()see Dense API)。當None傳遞給tf.get_variable作爲初始化方法,一個glorot_uniform_initializer將被使用:

如果初始化是無(默認值),在可變範圍傳遞 的默認初始值將被使用。如果那個是None,那麼將使用glorot_uniform_initializer。初始化器也可以是一個 張量器,在這種情況下,變量初始化爲這個值並且形狀爲 。

關於tf.get_variable的更多內容可以參考here

對於一個情況下,你使用的tf.random_normal初始化爲內核權重和偏見的權重,但對於其他的,你用tf.layers.dense並會導致glorot_uniform_initializer內核權重和zeros_initializer偏置權重,因爲沒有參數傳遞給tf.layers.dense

關於他們是否可以得救的第二個問題,是的,他們可以。

作爲最後一個注意事項,在使用tf.Variable時必須小心,因爲在範圍設置不正確時它可能會使事情複雜化。

+0

我正在面臨一些使用我的模型A進行預測的問題。特別是在n次輸入相同的輸入之後,n個logits總是不同的。但是,模型B中沒有這樣的問題。是由於上面解釋的原因嗎? – Bosen

+0

如果您正在保存和恢復權重並正確執行其他任何操作,則不會發生這種情況。向上述問題添加更多代碼或詢問另一個問題將有助於理解問題。 – jkschin

+0

我已添加更多代碼。我的實施有任何錯誤嗎? – Bosen