【问题标题】:Convert TensorFlow Tensor into numpy before assigning values to neural net在将值分配给神经网络之前将 TensorFlow Tensor 转换为 numpy
【发布时间】:2017-10-26 01:17:28
【问题描述】:

我正在使用DCGAN code。我需要修改the reward,它通过添加一个函数来获取该神经网络的输出,对其进行分析并对其进行惩罚,从而赋予其中一个神经网络。所以我的损失函数看起来像:

self.g_loss = self.g_loss + self.penalty

问题是

  • 这个惩罚函数只接受numpy数组作为输入(我没办法修改这个),

  • 神经网络输出是一个 tf.tensor,

  • 并且由于尚未将值分配给神经网络(从技术上讲,它尚未构建)我既不能运行 .eval() 也不能运行 sess.run()

    李>

那么在这种情况下,我如何将 tensorflow 张量转换为 numpy 数组?

【问题讨论】:

  • 如果您希望训练您的神经网络,您还需要为您的惩罚提供梯度。如果你有它,你可能需要向 tensorflow 添加一个自定义操作来处理这个问题......

标签: python numpy tensorflow


【解决方案1】:

Tensorflow 的 tf.py_func 对应于 wrapping Python functions and passing tensors to them。但是,您不能使用此损失函数来训练网络,因为 Tensorflow 不会自动区分 numpy 代码。

你很幸运,autograd does automatically differentiate numpy code。如果你使用它,在另一个tf.pyfunc 调用中,你可以获得渐变,然后你可以put back into the tensorflow graph on the backward pass

这是一个示例,说明如何在 this gist 中完成所有操作。

【讨论】:

  • 感谢您的回复。目前我使用g_optim = tf.train.AdamOptimizer(config.learning_rate, beta1=config.beta1) \ .minimize(self.g_loss, var_list=self.g_vars) 作为我的优化器。我将如何为我的所有(或至少部分)损失保留这一点?
  • 同时运行 tf-autograd.py 会引发以下错误:InvalidArgumentError (see above for traceback): 0-th value returned by pyfunc_1 is double, but expects float [[Node: PyFunc_1 = PyFunc[Tin=[DT_DOUBLE], Tout=[DT_FLOAT], token="pyfunc_1", _device="/job:localhost/replica:0/task:0/cpu:0"](Variable/read/_3)]] .
  • 你是在 gpu 上运行这个吗?在这种情况下,Tensorflow 默认为 float32,而 numpy 默认为 float64。
  • 是的,我在 GPU 上运行,我该如何解决这个差异?
  • 我已经更新了要点,所以它可以在带有 gpus 的系统上工作,但我能让它工作的唯一方法是在几乎所有地方强制使用 float32cpu 设备使用。
猜你喜欢
  • 1970-01-01
  • 2014-01-15
  • 1970-01-01
  • 2019-08-18
  • 1970-01-01
  • 2020-08-11
  • 2018-06-12
  • 2011-06-12
  • 2016-11-29
相关资源
最近更新 更多