在张量之间进行运算时出现“InvalidArgumentError:不兼容的形状:[64,40000] vs. [64] [Op:Mul]”?

2023-12-02

我正在尝试在两个张量之间执行此操作:

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]

这是我第一次进行张量运算,也许我对如何处理维度有点困惑,有什么建议吗?谢谢 :)

EDIT:好的,我已经明白了这一点,确实对于我提供的一切正常的例子,但是我的网络中还有另一个问题:

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]

我知道这是因为维度之间不匹配,但事实是输出层(张量)的形状应该是 [?,40000] 而我只得到 [40000] 的张量,有什么建议吗?

EDIT 2.0我没有注意到我的输出已经是 lambda 层,因此在模型编写方式中我没有收到任何错误,但是从这种方式的摘要中我得到 lambda 形状 (1, 40000),而通常应该是 (无, 40000)。 错误在哪里?


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

当操作两个数组时,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 on tf.multiply可以类似于做一个矩阵乘法

对于你的情况,你可能可以做类似的事情

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

如果额外的维度困扰你,你可以用以下方法摆脱它tf.squeeze.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在张量之间进行运算时出现“InvalidArgumentError:不兼容的形状:[64,40000] vs. [64] [Op:Mul]”? 的相关文章

随机推荐

  • CSS:顶部与顶部边缘

    我不确定我是否完全理解这两者之间的区别 有人可以解释为什么我会使用其中一种而不是另一种以及它们有何不同吗 如果您想将一个 块 元素从文档流中的其他元素移开 您可以使用边距 这意味着它将把以下元素推开 进一步向下 请注意 相邻块元素的垂直边距
  • 如何返回数组中可能存在的一组连续数字?

    如果我有一个已排序的数组 如何找到连续的数字 顺便说一句 这是为了确定扑克牌是否是顺子 数组中的重复项已被删除 我可以做到这一点 但这将是一种多行方法 我认为可能有一个使用可枚举方法的快速单行方法 例如 FindSequence 9 8 7
  • 如何知道黑莓设备是否有 GPS?

    我想知道设备是否有 GPS 对于 5 0 以下的设备如何做到这一点 查看文档Location Provider 在不同情况下的一些设备上尝试此代码 我认为它应该有效 try LocationProvider lp LocationProvi
  • 如何获取 Spring 4.1 使用的 Jackson ObjectMapper?

    Spring 4 1实例化一个JacksonObjectMapper实例 我有理由想要 Autowire将该实例放入我的一个控制器中 该控制器使用 Jackson 对它自己进行一些小的 JSON 解析 但是ObjectMapper它使用的应
  • 将container_of宏应用于嵌入的char数组时报告警告

    当我申请时container of宏到包含 char 数组的 C 结构 我得到警告 从不兼容的指针类型进行初始化 这是代码 define container of ptr type member const typeof type 0 gt
  • 字符串文字中的转义序列 (Fortran)

    C 中有一个例子 string str str First n Second n Third n cout lt lt str lt lt endl 输出将是 First Second Third 我想尝试在 Fortran 中重复它 但没
  • 如何连接Python IMAP4_SSL和自签名服务器SSL证书?

    我正在使用 python3 和imaplib连接到 Exchange 服务器 Exchange 服务器使用为主机名 my server fqdn 创建的自签名证书 最近在我的工作站 Ubuntu 14 04 上升级操作系统后 我的 pyth
  • Cin.get() 与 C++ 的问题[重复]

    这个问题在这里已经有答案了 我仍然不知道 Visual Studio 是如何工作的 据说它会让我的控制台保持打开状态 但事实并非如此 它仍然闪烁并关闭 难道我做错了什么 include
  • 我的 Linux 可执行程序(64 位)中的段 00 是什么

    这是一个非常简单的汇编程序 只需返回12执行后 cat a asm global start section text start mov rax 60 system call for exit mov rdi 12 exit code 1
  • 使用 htaccess 进行子域重定向,无需更改地址栏中的 URL

    我在我的网络主机上设置了一个子域 如下所示 en domain com pointing to the folder en 但是当在地址栏中输入 en domain com 时 URL变为 domain com en 如果我进一步导航 假设
  • 跨域心跳无法用jquery解析json数据

    我将我的模块 一个 asp net 项目 嵌入到 门户 中 门户生成一个 iframe 到我的 url 我知道它很糟糕 但我没有做到 为了避免在用户迭代我的 Web 项目时在主 门户 端进行会话 门户所有者告诉我通过 javascript
  • windows cmd shell 中的单个抑扬符是什么意思:更多?

    这可能不是一个真正与编程相关的问题 但我想知道很长一段时间 下面的cmd命令是什么意思 只需在 cmd shell 中输入一个抑扬符 Windows 就会要求更多 而只要你输入偶数个抑扬符 Windows 就无法获得足够的信息 从 Vist
  • 使用 renderscript 计算数组中值的总和

    嗨 我是新手 正在尝试编码渲染脚本 我想知道如何使用渲染脚本对数组中的元素求和 有没有办法可以将输出传递回脚本以进行顺序添加 我的问题陈述是 向量和 描述 计算数组中值的总和 输入 整数数组 输出 整数 任何帮助将非常感激 恐怕这比看起来要
  • 时间:2019-03-17 标签:c#list permutations with limit length

    我有一个报价列表 我想从中创建链长度有限的 链 例如排列 我已经使用 Kw Combinatorics 创建排列了project 但是 默认行为会在列表计数的长度中创建排列 我不知道如何将链长度限制为 n 这是我当前的代码 private
  • 在同一个 jlabel 上重新显示其他 img 存在困难

    我有点卡住了 当我按下提交按钮时 应该在 JLabel 图像的同一位置重新显示另一张图片 因此如果有人有任何想法 我将不胜感激 我正在使用 eclipse 并且程序正在编译和运行 这是代码 Here is the GUI of the pr
  • 控制表单字段访问的最佳实践

    我有一个经典的 3 层 ASP Net 3 5 Web 应用程序 其中包含显示业务对象并允许编辑它们的表单 表单上的控件对应于基础业务对象的属性 根据用户的角色 用户可以读 写 只读或无权访问各种控件 非常传统的东西 我的问题是 编码的面向
  • 将键值对分成两个数组

    将键和值分离到两个不同的数组中的最佳方法是什么 这样 var data A Key 34 Another Key 16 Last Key 10 会变成这样 data1 A Key Another Key Last Key data2 34
  • html5视频flash后备建议

    我正在使用 html5 video 标签 想知道您是否可以帮助回答以下问题 当包含不同的文件格式 mp4 ogg 等时 我是否还必须包含 flv 作为 Flash 后备 或者浏览器是否知道自动默认为 Flash 版本 目前我只使用 mp4
  • 如何解决 C++ 中用于维护静态局部变量的服务数据的线程安全性?

    考虑以下场景 我们有一个带有静态局部变量的 C 函数 void function static int variable obtain blahblablah 该函数需要同时从多个线程调用 因此我们添加一个临界区以避免并发访问静态本地 vo
  • 在张量之间进行运算时出现“InvalidArgumentError:不兼容的形状:[64,40000] vs. [64] [Op:Mul]”?

    我正在尝试在两个张量之间执行此操作 green mat sio loadmat green mat green np array green mat G2 green tf convert to tensor green green tf