在张量流中编写自定义成本函数

时间:2015-11-13 01:22:22

标签: numpy tensorflow

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

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 个答案:

答案 0 :(得分:6)

目前,张量流can't gather on axes other than the first - it's requested

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

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

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

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

x = tf.Something(...)

是张量流图形对象。 Numpy不知道如何应对这些对象。

foo = tf.run(x)

回到python可以处理的对象。

您通常希望将损耗计算保持在纯张量流中,因此tf中的交叉和其他函数也是如此。你可能不得不做很长时间的事情,因为它没有它的功能。

答案 1 :(得分:0)

刚才意识到以下失败:

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

你不能在tf对象上使用numpy函数,索引也是不同的。

答案 2 :(得分:0)

我认为你可以在tensorflow中使用“Wraps Python函数”方法。这是文档的link

至于那些回答“你为什么不使用tensorflow的内置功能来构建它?”的人们。 - 有时人们正在寻找的成本函数不能用tf的函数来表达或者非常困难。

答案 3 :(得分:-1)

这是因为你没有初始化你的变量,因此它现在没有你的Tensor(可以阅读更多in my answer here

做这样的事情:

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且只有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)。附:到目前为止,你还没有吃过你的占位符。