无需会话即可将张量转换为numpy

时间:2018-09-03 11:10:45

标签: python-3.x tensorflow tensorflow-estimator

我在python上使用tensorflow的估计器库。我想通过训练有素的老师来训练学生网络。我面临以下问题。

train_input_fn = tf.estimator.inputs.numpy_input_fn(
  x={"x": train_data},
  y=train_labels,
  batch_size=100,
  num_epochs=None,
  shuffle=True)

student_classifier.train(
  input_fn=train_input_fn,
  steps=20,
  hooks=None)

此代码返回传递给学生分类器的生成器对象。在生成器内部,我们将输入和标签(以100为批次)作为张量。问题是,我想将相同的值传递给教师模型并提取其softmax输出。但不幸的是,模型输入需要如下的numpy数组

student_classifier = tf.estimator.Estimator(
  model_fn=student_model_fn, model_dir="./models/mnist_student")

def student_model_fn(features, labels, mode): 
  sess=tf.InteractiveSession()
  tf.train.start_queue_runners(sess)
  data=features['x'].eval()
  out=labels.eval()
  sess.close()

  input_layer = tf.reshape(features["x"], [-1, 28, 28, 1])
  eval_teacher_fn = tf.estimator.inputs.numpy_input_fn(
      x={"x":data},
      y=out,
      num_epochs=1,
      shuffle=False)

这要求x和y为numpy数组,因此我通过使用诸如使用会话将张量转换为numpy的丑陋技巧的方法进行了转换。有更好的方法吗?

P.S。我尝试过tf.estimator.Estimator.get_variable_value(),但是它从模型中检索权重,而不是输入和输出

1 个答案:

答案 0 :(得分:0)

使用 tf.make_ndarray 将 Tensor 转换为 Numpy_array。

tf.make_ndarray(),创建一个形状和数据与张量相同的 numpy ndarray。

示例工作代码:

import tensorflow as tf
a = tf.constant([[1,2,3],[4,5,6]])
proto_tensor = tf.make_tensor_proto(a)  
tf.make_ndarray(proto_tensor)

输出:

array([[1, 2, 3],
     [4, 5, 6]], dtype=int32)
# output has shape (2,3)