我觉得这很尴尬,但你如何在张量内调整单个值?假设你想在张量中只有一个值加'1'?
通过索引编写它不起作用:
TypeError: 'Tensor' object does not support item assignment
Run Code Online (Sandbox Code Playgroud)
一种方法是建立一个相同形状的0张量.然后在您想要的位置调整1.然后你将两个张量加在一起.这又遇到了和以前一样的问题.
我已多次阅读API文档,似乎无法弄清楚如何执行此操作.提前致谢!
我想复制以下numpy代码tensorflow.例如,我想为0之前具有值的所有张量索引分配一个1.
a = np.array([1, 2, 3, 1])
a[a==1] = 0
# a should be [0, 2, 3, 0]
Run Code Online (Sandbox Code Playgroud)
如果我写相似的代码tensorflow我得到以下错误.
TypeError: 'Tensor' object does not support item assignment
Run Code Online (Sandbox Code Playgroud)
方括号中的条件应该是任意的,如a[a<1] = 0.
有没有办法实现这种"条件分配"(缺少一个更好的名字)tensorflow?
看我的Keras自定义损失函数:
def custom_loss(y_true, y_pred):
sqerr = (y_true - y_pred)**2
sqerr[:,4:-1:7] = sqerr[:,4:-1:7] * ((y_true[:,2:-1:7]-y_true[:,3:-1:7])/y_true[:,2:-1:7])**2
return sqerr.mean()
Run Code Online (Sandbox Code Playgroud)
但是'sqerr'不是一个numpy数组,因此此代码会导致错误
TypeError:“张量”对象不支持项目分配
因此,我阅读了“如何在Tensorflow中进行切片分配”一文,其中包括jdehesa的答案以及此讨论中的GitHub页面。所以这就是我现在所拥有的...
def custom_loss(y_true, y_pred):
sqerr = K.square(y_true-y_pred)
sqerr = tf.Variable( sqerr , validate_shape=False )
with tf.control_dependencies([sqerr[:,4:-1:7].assign( sqerr[:,4:-1:7] * ((y_true[:,2:-1:7]-y_true[:,3:-1:7])/y_true[:,2:-1:7])**2 )]):
sqerr = tf.identity(sqerr)
return K.mean(sqerr)
Run Code Online (Sandbox Code Playgroud)
...但是很明显我在实际使用它的时候就把它搞砸了:
追溯(最近一次通话):setup_model中的文件“ my_awesome_nn.py”,第119行
Run Code Online (Sandbox Code Playgroud)model.compile(loss=custom_loss, optimizer=opt)在编译的文件“ /opt/anaconda/envs/py35/lib/python3.5/site-packages/keras/engine/training.py”中,行850
Run Code Online (Sandbox Code Playgroud)sample_weight, mask)文件“ /opt/anaconda/envs/py35/lib/python3.5/site-packages/keras/engine/training.py”,行465,加权后
Run Code Online (Sandbox Code Playgroud)score_array = K.mean(score_array, axis=list(range(weight_ndim, ndim)))TypeError:“ NoneType”对象无法解释为整数
发生的事情是,TF切片仅允许应用于变量,而不是普通张量,因此我将其转换为变量。但是,当我强制转换为Variable时,它想知道形状,但是此时形状是“动态定义的”(即第一个元素是“?”)。因此,设置validate_shape = False可以让我实际定义一个变量,但这会破坏Keras以后想要的尺寸信息。观察:
def custom_loss(y_true, y_pred):
sqerr = K.square(y_true-y_pred)
print("K.ndim(sqerr) #1 …Run Code Online (Sandbox Code Playgroud) 我想在 TensorFlow 2.x 中的一个模型中为输入张量的切片分配一些值(我使用的是 2.2,但准备接受 2.1 的解决方案)。我正在尝试做的一个非工作模板是:
import tensorflow as tf
from tensorflow.keras.models import Model
class AddToEven(Model):
def call(self, inputs):
outputs = inputs
outputs[:, ::2] += inputs[:, ::2]
return outputs
Run Code Online (Sandbox Code Playgroud)
当然,在构建此 ( AddToEven().build(tf.TensorShape([None, None]))) 时,我收到以下错误:
TypeError: 'Tensor' object does not support item assignment
Run Code Online (Sandbox Code Playgroud)
我可以通过以下方式实现这个简单的例子:
TypeError: 'Tensor' object does not support item assignment
Run Code Online (Sandbox Code Playgroud)
(您可以通过以下方式进行完整性检查:
class AddToEvenScatter(Model):
def call(self, inputs):
batch_size = tf.shape(inputs)[0]
n = tf.shape(inputs)[-1]
update_indices = tf.range(0, n, delta=2)[:, None]
scatter_nd_perm = [1, 0]
inputs_reshaped = tf.transpose(inputs, scatter_nd_perm)
outputs …Run Code Online (Sandbox Code Playgroud)