在张量流中编写自定义成本函数
writing a custom cost function in tensorflow
我正在尝试在张量流中编写自己的成本函数,但显然我不能 'slice' 张量对象?
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'>
刚刚意识到以下失败:
cross_entropy = -tf.reduce_sum(y_*np.log(y))
你不能在 tf 对象上使用 numpy 函数,索引也可能不同。
这是因为你还没有初始化你的变量,因此它现在没有你的张量(可以阅读更多)
就像这样:
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)
。 P.S。到目前为止你还没有喂饱你的占位符。
目前tensorflow 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]))
这是解决当前 gather 实施中的一些限制的有用解决方法。
(但是你不能在 tensorflow 节点上使用 numpy 切片也是正确的 - 你可以 运行 它并切片输出,而且你需要在你之前初始化这些变量 运行.:)。您正在以一种行不通的方式混合 tf 和 np。
x = tf.Something(...)
是张量流图对象。 Numpy 不知道如何处理这些对象。
foo = tf.run(x)
返回到python可以处理的对象。
您通常希望在纯张量流中进行损失计算,tf.您可能需要做 arccos 很长一段时间,因为 tf 没有它的功能。
我认为你可以在 tensorflow 中使用 "Wraps Python function" 方法。这是文档的 link。
至于回答的人 "Why don't you just use tensorflow's built in function to construct it?" - 有时人们正在寻找的成本函数无法用 tf 的函数表达或非常困难。
我正在尝试在张量流中编写自己的成本函数,但显然我不能 'slice' 张量对象?
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'>
刚刚意识到以下失败:
cross_entropy = -tf.reduce_sum(y_*np.log(y))
你不能在 tf 对象上使用 numpy 函数,索引也可能不同。
这是因为你还没有初始化你的变量,因此它现在没有你的张量(可以阅读更多
就像这样:
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)
。 P.S。到目前为止你还没有喂饱你的占位符。
目前tensorflow 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]))
这是解决当前 gather 实施中的一些限制的有用解决方法。
(但是你不能在 tensorflow 节点上使用 numpy 切片也是正确的 - 你可以 运行 它并切片输出,而且你需要在你之前初始化这些变量 运行.:)。您正在以一种行不通的方式混合 tf 和 np。
x = tf.Something(...)
是张量流图对象。 Numpy 不知道如何处理这些对象。
foo = tf.run(x)
返回到python可以处理的对象。
您通常希望在纯张量流中进行损失计算,tf.您可能需要做 arccos 很长一段时间,因为 tf 没有它的功能。
我认为你可以在 tensorflow 中使用 "Wraps Python function" 方法。这是文档的 link。
至于回答的人 "Why don't you just use tensorflow's built in function to construct it?" - 有时人们正在寻找的成本函数无法用 tf 的函数表达或非常困难。