繁体   English   中英

如何在重新训练时初始化tensorflow.contrib.slim fully_connected图层的权重和偏差?

[英]How can I initialize weights and biases of tensorflow.contrib.slim fully_connected layer while re-training?

保存并训练了张量流图后,我将其恢复为具有不同损失函数的重新训练,如下所示:

 import tensorflow as tf
 import numpy as np
 import pyximport
 pyximport.install()
 import math
 import tensorflow.contrib.slim as slim
 raw_data_train = np.loadtxt('all_data/train_all_raw.csv', skiprows = 1, delimiter=',')
 users = (np.unique(raw_data_train[ :, 0]))
 items = (np.unique(raw_data_train[ :, 1]))
 saver = tf.train.import_meta_graph('all_data/my_test_model.meta')

 with tf.Session() as sess:
     tf.global_variables_initializer().run(session=sess)
     saver.restore(sess, tf.train.latest_checkpoint('all_data/'))

     # placeholders
     user_ids = sess.graph.get_tensor_by_name('user_ids:0')
     left_ids = sess.graph.get_tensor_by_name('left_ids:0')

     # variables
     user_latents = sess.graph.get_tensor_by_name('user_latents:0')
     item_latents = sess.graph.get_tensor_by_name('item_latents:0')

     # network was initiall defined as variable_scope "nn" that is why I am retrieving them as "nn/*" in the following line

     weights_0 = sess.graph.get_tensor_by_name('nn/fully_connected/weights:0')
     biases_0 = sess.graph.get_tensor_by_name('nn/fully_connected/biases:0')
     weights_1 = sess.graph.get_tensor_by_name('nn/fully_connected_1/weights:0')
     biases_1 = sess.graph.get_tensor_by_name('nn/fully_connected_1/biases:0')

     # lookups

     user_embeddings = sess.graph.get_tensor_by_name('embedding_user:0')
     item_left_embeddings = sess.graph.get_tensor_by_name('embedding_left:0')


     # dictionary
     fd = {
       user_ids: users,
       left_ids: items,
     }
     left_emb_val, weights_0_val, biases_0_val, weights_1_val, biases_1_val = sess.run([left_emb, weights_0, biases_0, weights_1, biases_1], feed_dict=fd)

     joined_input = tf.concat( [user_embeddings, item_left_embeddings], 1)
     net = slim.fully_connected(inputs=joined_input, num_outputs=64,           weights_initializer = tf.constant_initializer(weights_0_val), biases_initializer=tf.constant_initializer(biases_0_val), activation_fn=tf.nn.relu)
     left_output = slim.fully_connected(inputs=net, num_outputs=1, weights_initializer = tf.constant_initializer(weights_1_val), biases_initializer=tf.constant_initializer(biases_1_val), activation_fn=None)

# ********* below line gives an error *************

     left_output_val = sess.run([left_output], feed_dict=fd)
     print(left_output_val)

当我尝试通过调用sess.run来计算left_output_val的值时,上面的代码会出现以下错误。

 FailedPreconditionError (see above for traceback): Attempting to use uninitialized value fully_connected_1/biases
 [[Node: fully_connected_1/biases/read = Identity[T=DT_FLOAT, _class=["loc:@fully_connected_1/biases"], _device="/job:localhost/replica:0/task:0/cpu:0"](fully_connected_1/biases)]]

这对我来说有点令人惊讶,因为:

  1. 我使用以下行初始化了所有变量:

      tf.global_variables_initializer().run(session=sess) 

    这可能是因为这里没有使用此行初始化权重和偏差: 在Tensorflow中使用Adadelta优化器时未初始化的值错误

  2. 我正在以下几行初始化权重和偏差:

     net = slim.fully_connected(inputs=joined_input, num_outputs=64, weights_initializer = tf.constant_initializer(weights_0_val), biases_initializer=tf.constant_initializer(biases_0_val), activation_fn=tf.nn.relu) left_output = slim.fully_connected(inputs=net, num_outputs=1, weights_initializer = tf.constant_initializer(weights_1_val), biases_initializer=tf.constant_initializer(biases_1_val), activation_fn=None) 

    在运行会话和计算left_output_val的值时,仍存在单位化权重和偏差错误

我很欣赏在这里解决我的问题的各种想法。

问题是由于以下原因:

tf.global_variables_initializer().run(session=sess)

它应该是:

left_output = slim.fully_connected(inputs=net, num_outputs=1, weights_initializer = tf.constant_initializer(weights_1_val), biases_initializer=tf.constant_initializer(biases_1_val), activation_fn=None)

您可以从此密集层获取变量并手动初始化它们。

with tf.variable_scope('fully_connected_1', reuse=True):
  weights = tf.get_variable('weights')
  biases = tf.get_variable('biases')

  sess.run([weights.initializer, biases.initializer])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM