如何解决问题:“'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
创建变量。
我试图按元素对两个张量求和,但失败了。 我的代码如下。 我想将 '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
创建变量。