簡體   English   中英

“InvalidArgumentError: Incompatible shapes: [64,40000] vs. [64] [Op:Mul]” 在張量之間進行操作時?

[英]"InvalidArgumentError: Incompatible shapes: [64,40000] vs. [64] [Op:Mul]" while doing operations between tensors?

我正在嘗試在兩個張量之間執行此操作:

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 個元素的張量,用作 neural.network 的一個層,但是當我運行這個 function 作為測試時,我有這個錯誤:

tensorflow.python.framework.errors_impl.InvalidArgumentError: Incompatible shapes: [64,40000] vs. [64] [Op:Mul]

這是我第一次從事張量運算,也許我對如何處理尺寸有點困惑,有什么建議嗎? 謝謝:)

編輯:好的,我已經理解了這一點,確實對於我提供的一切正常的例子,但是我在 my.network 中遇到了另一個問題:

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

我得到這個錯誤:

ValueError: Input 0 of layer sf_vec is incompatible with the layer: : expected min_ndim=2, found ndim=1. Full shape received: [40000]

我知道這是因為尺寸不匹配,但事實是 output 層(張量)的形狀應該是 [?,40000] 而我只得到 [40000] 的張量,有什么建議嗎?

編輯 2.0我沒有注意到我的 output 已經是 lambda 層,所以在編寫 model 的方式中我沒有得到任何錯誤,但是從這樣的總結中我得到 lambda 形狀 (1, 40000) 而通常應該是 (無,40000)。 錯誤在哪里?

如果您想在 2 個張量之間進行乘法運算,它們需要具有兼容的形狀,即相同的形狀或可廣播的形狀。 引用 numpy 文檔(tensorflow 遵循相同的廣播規則):

當對兩個 arrays 進行操作時,NumPy 按元素比較它們的形狀。 它從尾隨維度開始,並向前推進。 兩個維度兼容時

  • 他們是平等的,或者
  • 其中之一是 1

在您的情況下,如果您想使用tf.multiply ,則需要向矢量添加一個維度,以便它具有相同數量的維度。 您可以通過使用tf.expand_dims或使用tf.newaxis的高級索引來做到這一點。

一個例子(使用復合物,就像你的問題一樣):

>>> a = tf.complex(tf.random.normal((64,128)),tf.random.normal((64,128)))
>>> a.shape
TensorShape([64, 128])
>>> b = tf.complex(tf.ones(64),tf.ones(64))
>>> b.shape
TensorShape([64])

為了能夠使用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.reduce_sum上執行tf.multiply類似於只執行矩陣乘法

在你的情況下,你可能可以做類似的事情

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

如果額外的維度困擾您,您可以使用tf.squeeze擺脫它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM