5

我正在尝试在张量流中编写自己的成本函数,但显然我不能“切片”张量对象?

import tensorflow as tf
import numpy as np

# Establish variables
x = tf.placeholder("float", [None, 3])
W = tf.Variable(tf.zeros([3,6]))
b = tf.Variable(tf.zeros([6]))

# Establish model
y = tf.nn.softmax(tf.matmul(x,W) + b)

# Truth
y_ = tf.placeholder("float", [None,6])

def angle(v1, v2):
  return np.arccos(np.sum(v1*v2,axis=1))

def normVec(y):
  return np.cross(y[:,[0,2,4]],y[:,[1,3,5]])

angle_distance = -tf.reduce_sum(angle(normVec(y_),normVec(y)))
# This is the example code they give for cross entropy
cross_entropy = -tf.reduce_sum(y_*tf.log(y))

我收到以下错误: TypeError: Bad slice index [0, 2, 4] of type <type 'list'>

4

4 回答 4

6

目前,tensorflow不能聚集在第一个轴以外的轴上——它是请求的

但是对于你在这种特定情况下想要做的事情,你可以转置,然后收集 0,2,4,然后转置回来。它不会很快疯狂,但它有效:

tf.transpose(tf.gather(tf.transpose(y), [0,2,4]))

对于当前收集的实现中的一些限制,这是一个有用的解决方法。

(但您不能在 tensorflow 节点上使用 numpy 切片也是正确的 - 您可以运行它并对输出进行切片,并且您还需要在运行之前初始化这些变量。:)。您正在以一种不起作用的方式混合 tf 和 np 。

x = tf.Something(...)

是一个张量流图对象。Numpy 不知道如何处理这些对象。

foo = tf.run(x)

回到python可以处理的对象。

您通常希望将损失计算保留在纯 tensorflow 中,因此在 tf.cross 和其他函数中也是如此。你可能不得不做很长的路要走 arccos,因为 tf 没有它的功能。

于 2015-11-17T04:22:18.790 回答
0

刚刚意识到以下失败:

cross_entropy = -tf.reduce_sum(y_*np.log(y))

您不能在 tf 对象上使用 numpy 函数,并且索引也不同。

于 2015-11-13T01:32:03.897 回答
0

我认为您可以在 tensorflow 中使用“Wraps Python function”方法。这是文档的链接

至于回答“为什么不直接使用 tensorflow 的内置函数来构建它?”的人呢?- 有时人们正在寻找的成本函数无法用 tf 的函数表示或极其困难。

于 2016-09-09T05:21:02.367 回答
-1

这是因为您尚未初始化变量,因此它现在没有您的张量(可以在我的答案中阅读更多信息)

只需执行以下操作:

def normVec(y):
    print y
    return np.cross(y[:,[0,2,4]],y[:,[1,3,5]])

t1 = normVec(y_)
# and comment everything after it.

看到你现在只有一个张量Tensor("Placeholder_1:0", shape=TensorShape([Dimension(None), Dimension(6)]), dtype=float32)

尝试初始化变量

init = tf.initialize_all_variables()
sess = tf.Session()
sess.run(init)

并评估您的变量sess.run(y)。PS你到目前为止还没有喂你的占位符。

于 2015-11-13T01:35:02.723 回答