Tensorflow:tf.argmax 和切片
Tensorflow : tf.argmax and slicing
我想设计这个损失函数:
sum((y[argmax(y_)] - y_[argmax(y_)])²)
我找不到方法 y[argmax(y_)]
。我尝试了 y[k]
、y[:,k]
和 y[None,k]
none 这些工作。这是我的代码:
Na = 3
x = tf.placeholder(tf.float32, [None, 2])
W = tf.Variable(tf.zeros([2, Na]))
b = tf.Variable(tf.zeros([Na]))
y = tf.nn.relu(tf.matmul(x, W) + b)
y_ = tf.placeholder(tf.float32, [None, 3])
k = tf.argmax(y_, 1)
diff = y[k] - y_[k]
loss = tf.reduce_sum(tf.square(diff))
错误:
File "/home/ncarrara/phd/code/cython/robotnavigation/ftq/cftq19.py", line 156, in <module>
diff = y[k] - y_[k]
File "/home/ncarrara/miniconda3/lib/python2.7/site-packages/tensorflow/python/ops/array_ops.py", line 499, in _SliceHelper
name=name)
File "/home/ncarrara/miniconda3/lib/python2.7/site-packages/tensorflow/python/ops/array_ops.py", line 663, in strided_slice
shrink_axis_mask=shrink_axis_mask)
File "/home/ncarrara/miniconda3/lib/python2.7/site-packages/tensorflow/python/ops/gen_array_ops.py", line 3515, in strided_slice
shrink_axis_mask=shrink_axis_mask, name=name)
File "/home/ncarrara/miniconda3/lib/python2.7/site-packages/tensorflow/python/framework/op_def_library.py", line 767, in apply_op
op_def=op_def)
File "/home/ncarrara/miniconda3/lib/python2.7/site-packages/tensorflow/python/framework/ops.py", line 2508, in create_op
set_shapes_for_outputs(ret)
File "/home/ncarrara/miniconda3/lib/python2.7/site-packages/tensorflow/python/framework/ops.py", line 1873, in set_shapes_for_outputs
shapes = shape_func(op)
File "/home/ncarrara/miniconda3/lib/python2.7/site-packages/tensorflow/python/framework/ops.py", line 1823, in call_with_requiring
return call_cpp_shape_fn(op, require_shape_fn=True)
File "/home/ncarrara/miniconda3/lib/python2.7/site-packages/tensorflow/python/framework/common_shapes.py", line 610, in call_cpp_shape_fn
debug_python_shape_fn, require_shape_fn)
File "/home/ncarrara/miniconda3/lib/python2.7/site-packages/tensorflow/python/framework/common_shapes.py", line 676, in _call_cpp_shape_fn_impl
raise ValueError(err.message)
ValueError: Shape must be rank 1 but is rank 2 for 'strided_slice' (op: 'StridedSlice') with input shapes: [?,3], [1,?], [1,?], [1].
可以使用 tf.gather_nd
:
import tensorflow as tf
Na = 3
x = tf.placeholder(tf.float32, [None, 2])
W = tf.Variable(tf.zeros([2, Na]))
b = tf.Variable(tf.zeros([Na]))
y = tf.nn.relu(tf.matmul(x, W) + b)
y_ = tf.placeholder(tf.float32, [None, 3])
k = tf.argmax(y_, 1)
# Make index tensor with row and column indices
num_examples = tf.cast(tf.shape(x)[0], dtype=k.dtype)
idx = tf.stack([tf.range(num_examples), k], axis=-1)
diff = tf.gather_nd(y, idx) - tf.gather_nd(y_, idx)
loss = tf.reduce_sum(tf.square(diff))
解释:
在这种情况下,tf.gather_nd
的想法是制作一个矩阵(二维张量),其中每一行包含要在输出中包含的行和列的索引。例如,如果我有一个矩阵 a
包含:
| 1 2 3 |
| 4 5 6 |
| 7 8 9 |
和一个矩阵 i
包含:
| 1 2 |
| 0 1 |
| 2 2 |
| 1 0 |
那么 tf.gather_nd(a, i)
的结果将是向量(一维张量)包含:
| 6 |
| 2 |
| 9 |
| 4 |
在这种情况下,列索引由 k
中的 tf.argmax
给出;它会告诉您,对于每一行,哪一列是具有最高值的。现在您只需要将行索引与其中的每一个放在一起。 k
中的第一个元素是第 0 行中最大值列的索引,下一个元素是第 1 行的索引,依此类推。 num_examples
只是 x
中的行数,然后 tf.range(num_examples)
为您提供一个从 0 到 x
中的行数减去 1 的向量(即所有序列行索引)。现在你只需要将它与 k
放在一起,这就是 tf.stack
所做的,结果 idx
是 tf.gather_nd
.
的参数
我想设计这个损失函数:
sum((y[argmax(y_)] - y_[argmax(y_)])²)
我找不到方法 y[argmax(y_)]
。我尝试了 y[k]
、y[:,k]
和 y[None,k]
none 这些工作。这是我的代码:
Na = 3
x = tf.placeholder(tf.float32, [None, 2])
W = tf.Variable(tf.zeros([2, Na]))
b = tf.Variable(tf.zeros([Na]))
y = tf.nn.relu(tf.matmul(x, W) + b)
y_ = tf.placeholder(tf.float32, [None, 3])
k = tf.argmax(y_, 1)
diff = y[k] - y_[k]
loss = tf.reduce_sum(tf.square(diff))
错误:
File "/home/ncarrara/phd/code/cython/robotnavigation/ftq/cftq19.py", line 156, in <module>
diff = y[k] - y_[k]
File "/home/ncarrara/miniconda3/lib/python2.7/site-packages/tensorflow/python/ops/array_ops.py", line 499, in _SliceHelper
name=name)
File "/home/ncarrara/miniconda3/lib/python2.7/site-packages/tensorflow/python/ops/array_ops.py", line 663, in strided_slice
shrink_axis_mask=shrink_axis_mask)
File "/home/ncarrara/miniconda3/lib/python2.7/site-packages/tensorflow/python/ops/gen_array_ops.py", line 3515, in strided_slice
shrink_axis_mask=shrink_axis_mask, name=name)
File "/home/ncarrara/miniconda3/lib/python2.7/site-packages/tensorflow/python/framework/op_def_library.py", line 767, in apply_op
op_def=op_def)
File "/home/ncarrara/miniconda3/lib/python2.7/site-packages/tensorflow/python/framework/ops.py", line 2508, in create_op
set_shapes_for_outputs(ret)
File "/home/ncarrara/miniconda3/lib/python2.7/site-packages/tensorflow/python/framework/ops.py", line 1873, in set_shapes_for_outputs
shapes = shape_func(op)
File "/home/ncarrara/miniconda3/lib/python2.7/site-packages/tensorflow/python/framework/ops.py", line 1823, in call_with_requiring
return call_cpp_shape_fn(op, require_shape_fn=True)
File "/home/ncarrara/miniconda3/lib/python2.7/site-packages/tensorflow/python/framework/common_shapes.py", line 610, in call_cpp_shape_fn
debug_python_shape_fn, require_shape_fn)
File "/home/ncarrara/miniconda3/lib/python2.7/site-packages/tensorflow/python/framework/common_shapes.py", line 676, in _call_cpp_shape_fn_impl
raise ValueError(err.message)
ValueError: Shape must be rank 1 but is rank 2 for 'strided_slice' (op: 'StridedSlice') with input shapes: [?,3], [1,?], [1,?], [1].
可以使用 tf.gather_nd
:
import tensorflow as tf
Na = 3
x = tf.placeholder(tf.float32, [None, 2])
W = tf.Variable(tf.zeros([2, Na]))
b = tf.Variable(tf.zeros([Na]))
y = tf.nn.relu(tf.matmul(x, W) + b)
y_ = tf.placeholder(tf.float32, [None, 3])
k = tf.argmax(y_, 1)
# Make index tensor with row and column indices
num_examples = tf.cast(tf.shape(x)[0], dtype=k.dtype)
idx = tf.stack([tf.range(num_examples), k], axis=-1)
diff = tf.gather_nd(y, idx) - tf.gather_nd(y_, idx)
loss = tf.reduce_sum(tf.square(diff))
解释:
在这种情况下,tf.gather_nd
的想法是制作一个矩阵(二维张量),其中每一行包含要在输出中包含的行和列的索引。例如,如果我有一个矩阵 a
包含:
| 1 2 3 |
| 4 5 6 |
| 7 8 9 |
和一个矩阵 i
包含:
| 1 2 |
| 0 1 |
| 2 2 |
| 1 0 |
那么 tf.gather_nd(a, i)
的结果将是向量(一维张量)包含:
| 6 |
| 2 |
| 9 |
| 4 |
在这种情况下,列索引由 k
中的 tf.argmax
给出;它会告诉您,对于每一行,哪一列是具有最高值的。现在您只需要将行索引与其中的每一个放在一起。 k
中的第一个元素是第 0 行中最大值列的索引,下一个元素是第 1 行的索引,依此类推。 num_examples
只是 x
中的行数,然后 tf.range(num_examples)
为您提供一个从 0 到 x
中的行数减去 1 的向量(即所有序列行索引)。现在你只需要将它与 k
放在一起,这就是 tf.stack
所做的,结果 idx
是 tf.gather_nd
.