如何解决问题:“'Tensor' 对象不支持项目分配”

How to solve the problem: "'Tensor' object does not support item assignment"

我试图按元素对两个张量求和,但失败了。 我的代码如下。 我想将 'a' 的元素分配为 [x[0]*y[0]-x[1]*y[1], x[0]*y[1]+x[1]*y[ 0]、x[2]*y[2]-x[3]*y[3]、x[2]*y[3]+x[3]*y[2]]。 由于我是 Keras 和 tensorflow 的初学者,我不想在 tensorflow 中使用 'session'。我如何仅使用keras后端分配上述值?

from keras import backend as K
def rayleigh_fading(x):
    global noise_std, n_channel
    y = K.random_normal((2*n_channel,), mean=0, stddev=1.0)*(1/np.sqrt(2))
    a = K.placeholder(shape=(4,))
    a[0] = x[0]*y[0]-x[1]*y[1]
    a[1] = x[0]*y[1]+x[1]*y[0] 
    a[2] = x[2]*y[2]-x[3]*y[3]
    a[3] = x[2]*y[3]+x[3]*y[2]
    z = a + K.random_normal((2*n_channel,), mean=0, sttdev=noise_std)
return z

尝试如下操作:

import tensorflow as tf
import numpy as np

keras = tf.keras

from tensorflow.keras import backend as K

noise_std = 1
n_channel = 2

def rayleigh_fading(x):
    global noise_std, n_channel
    y = K.random_normal((K.shape(x)[0], 2*n_channel,), mean=0, stddev=1.0)*(1/np.sqrt(2))
    a0 = x[:, 0]*y[:, 0]-x[:, 1]*y[:, 1]
    a1 = x[:, 0]*y[:, 1]+x[:, 1]*y[:, 0] 
    a2 = x[:, 2]*y[:, 2]-x[:, 3]*y[:, 3]
    a3 = x[:, 2]*y[:, 3]+x[:, 3]*y[:, 2]
    a_tensors = [K.expand_dims(t) for t in [a0, a1, a2, a3]]
    a = K.concatenate(a_tensors, axis=1)
    z = a + K.random_normal((2*n_channel,), mean=0, stddev=noise_std)
    return z

def make_model():
  inp = keras.layers.Input(shape=(4,))
  rf = keras.layers.Lambda(rayleigh_fading)(inp)
  out = keras.layers.Dense(1)(rf)
  model = keras.models.Model(inp, out)
  model.compile('adam', 'mse')
  return model

model = make_model()
model.summary()

我假设 y 应该在每批次的基础上从随机变量中抽样; z 应该最有可能具有形状 (batch_size, 2*n_channel) 也...其中 batch_size 是 K.shape(x)[0].

您尝试的主要问题是占位符不是可以修改的变量。它是模型输入数据的占位符。您还应该考虑到在张量级别 x 具有批量维度。因此,要跨所有批次访问 x 的第一列,您需要使用 x[:, 0].

我只是通过连接方程中的向量来避免为 a 创建变量。