Python &引用;InvalidArgumentError:不兼容的形状:[6440000]与[64][Op:Mul]”;在张量之间做运算的时候?

Python &引用;InvalidArgumentError:不兼容的形状:[6440000]与[64][Op:Mul]”;在张量之间做运算的时候?,python,tensorflow,neural-network,layer,tensor,Python,Tensorflow,Neural Network,Layer,Tensor,我试着在两个张量之间做这个运算: green_mat = sio.loadmat('green.mat') green = np.array(green_mat['G2']) green = tf.convert_to_tensor(green) green = tf.cast(green, dtype='complex64') # >>>green.shape = TensorShape([64, 40000]) tensor = tf.ones(128,1)

我试着在两个张量之间做这个运算:

green_mat = sio.loadmat('green.mat')
green = np.array(green_mat['G2'])
green = tf.convert_to_tensor(green)
green = tf.cast(green, dtype='complex64')  # >>>green.shape = TensorShape([64, 40000])



tensor = tf.ones(128,1)        # tensor.shape = TensorShape([128])

def mul_and_sum(tensor):
   real = tensor[0:64]
   imag = tensor[64:128]
   complex_tensor = tf.complex(real, imag)
   return tf.reduce_sum((tf.multiply(green, complex_tensor), 1))

res = mul_and_sum(tensor)
基本上,最后我想要得到的是一个含有40000个元素的张量,用作神经网络的层,但是当我运行这个函数作为测试时,我有一个错误:

tensorflow.python.framework.errors_impl.InvalidArgumentError: Incompatible shapes: [64,40000] vs. [64] [Op:Mul]
ValueError: Input 0 of layer sf_vec is incompatible with the layer: : expected min_ndim=2, found ndim=1. Full shape received: [40000]
这是我第一次研究张量运算,也许我对如何处理维数有点困惑,有什么建议吗?谢谢:)

编辑:好的,我已经理解了这一点,事实上,我提供的一切都是有效的,但是我的网络中还有另一个问题:

def convolution(tensor):
tf.cast(tensor, dtype='float64')
real = tensor[0:64]
imag = tensor[64:128]
complex_tensor = tf.complex(real, imag)
a = tf.math.real(tf.reduce_sum((tf.multiply(green, complex_tensor)), 0))
return a

def get_model3(mask_kind):
epochs = 200
learning_rate = 0.1
decay_rate = learning_rate / epochs
inp_1 = keras.Input(shape=(64, 101, 129), name="RST_inputs")
x = layers.Conv2D(1, kernel_size=(1, 1), strides=(1, 1), padding="valid", trainable=False)(inp_1)
x = layers.Conv2D(256, kernel_size=(3, 3), kernel_regularizer=l2(1e-6), strides=(3, 3), padding="same")(x)
x = layers.LeakyReLU(alpha=0.3)(x)
x = layers.Conv2D(128, kernel_size=(3, 3), kernel_regularizer=l2(1e-6), strides=(3, 3), padding="same")(x)
x = layers.LeakyReLU(alpha=0.3)(x)
x = layers.Conv2D(64, kernel_size=(2, 2), kernel_regularizer=l2(1e-6), strides=(2, 2), padding="same")(x)
x = layers.LeakyReLU(alpha=0.3)(x)
x = layers.Conv2D(32, kernel_size=(2, 2), kernel_regularizer=l2(1e-6), strides=(2, 2), padding="same")(x)
x = layers.LeakyReLU(alpha=0.3)(x)
x = layers.Flatten()(x)
x = layers.Dense(512)(x)
x = layers.LeakyReLU(alpha=0.3)(x)
x = layers.Dense(256)(x)
x = layers.LeakyReLU(alpha=0.3)(x)
out1 = layers.Dense(128, name="ls_weights")(x)

if mask_kind == 1:
    binary_mask = layers.Lambda(mask_layer1, name="lambda_layer", dtype='float64')(out1)
elif mask_kind == 2:
    binary_mask = layers.Lambda(mask_layer2, name="lambda_layer", dtype='float64')(out1)
else:
    binary_mask = out1
#here the binary mask shape is [?,128]
binary_mask = tf.expand_dims(binary_mask, axis=2)  #here the shape is [?,128,1]
binary_mask = tf.squeeze(binary_mask, axis=0) #here the shape is [128,1]

print('binary shape:', binary_mask.shape)

lambda_layer = layers.Lambda(convolution, name="convolutional_layer")(binary_mask)
print(lambda_layer.shape)


model3 = keras.Model(inp_1,  lambda_layer, name="2_out_model")

model3.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=decay_rate),  # in caso
               # rimettere 0.001
               loss="mean_squared_error")

plot_model(model3, to_file='model.png', show_shapes=True, show_layer_names=True)
model3.summary()

return model3
我得到了这个错误:

tensorflow.python.framework.errors_impl.InvalidArgumentError: Incompatible shapes: [64,40000] vs. [64] [Op:Mul]
ValueError: Input 0 of layer sf_vec is incompatible with the layer: : expected min_ndim=2, found ndim=1. Full shape received: [40000]
我知道这是因为维度之间不匹配,但事实是输出层的形状(张量)应该是[?,40000],而我得到的张量只有[40000],有什么建议吗

编辑2.0我没有注意到我的输出已经是lambda层了,所以在模型编写的方式上我没有得到任何错误,但是从总结中我得到了lambda形状(14000),而通常应该是(无,40000)。
错误在哪里?

如果要在两个张量之间进行乘法,它们需要具有兼容的形状,即,相同的形状或相同的形状。引用numpy文档(tensorflow遵循相同的广播规则):

在两个阵列上操作时,NumPy会按元素比较它们的形状。它从后面的维度开始,然后继续前进。当需要时,两个维度是兼容的

  • 他们是平等的,或者
  • 其中一个是1
在本例中,如果要使用
tf.multiply
,则需要向向量中添加一个维度,使其具有相同数量的维度。您可以使用
tf.expand_dims
或使用
tf.newaxis
的高级索引来实现这一点

例如(使用复合词,如您的问题中所述):

要能够使用
tf.multiply
,您需要向
b
添加维度:

>>> b_exp = tf.exand_dims(b, axis=1)
>>> b_exp.shape
TensorShape([64, 1])
>>> tf.multiply(a,b_exp).shape
TensorShape([64, 128])

注意:在
tf.multiply上执行
tf.reduce_sum
类似于只执行一次

在您的情况下,您可能可以执行类似的操作

>>> tf.matmul(b[tf.newaxis,:], a).shape
TensorShape([1, 128])

如果额外的维度困扰您,您可以使用
tf.squeeze

摆脱它,谢谢您的回答!!事实上,你的建议对我的简单例子很有效,但现在我认为对我的实际情况来说更难。如果你想看一看,我编辑了这篇文章,谢谢:)