required broadcastable shapes at loc(unknown)

最近在运行程序的时候,发现一个这样的报错内容

required broadcastable shapes at loc(unknown)[Op:AddV2]

经过对于代码的检查发现,这里是由于tensor对应的形状不同而导致的
发生错误的语句:

attention_scores = attention_scores+bias_data

这里的attention_scores = (5,12,128,128),bias_data = (5,128,128),两个维度相应的有差距,所以在相加的时候会发生报错现象。
此时我们只需要简单地将bias_data扩展一下维度,便可以达到能够进行相应的加和的效果

attention_scores = attention_scores+bias_data[:,None,:,:]

此时相加的形状便成为了

attention_scores(5,12,128,128)+bias_data[:,None,:,:](5,1,128,128) = (5,12,128,128)

由此可见,required broadcastable shapes往往是由维度不同造成的,而这种错误也很好被发现,通过调用一波模型便可以发现相应的错误。

token_ids = tf.ones([5,128])
segment_ids = tf.ones([5,128])
input_ids = [token_ids,segment_ids]
output = bertmodel(input_ids)

ps:另外一种维度不同造成的错误
今天在写程序的时候报相应的错误:required broadcastable shapes at loc(unknown)
发现报错的相应语句一直对应如下语句

position_embeddings = self.position_embeddings_table[None,:seq_len]

以及两个embeddings相加的部分

results = word_embeddings+position_embeddings

这里一直报错,经过排查之后发现是索引的问题
这里必须整理成相应的网络层才会发现问题,所以这里我将对应的position_embedding改写成为一个Embedding层

self.position_embeddings_table = self.add_weight(
    name="position_embeddings/embeddings",
    dtype=K.floatx(),
    shape=[self.max_position_embeddings,self.embedding_size],
    initializer=self.create_initializer()
)

进行embedding调度的过程中

position_ids = K.arange(0,seq_len,dtype='int32')[None]
position_embedding = self.position_embeddings_layer(position_ids)

这里的seq_len超过放入的最大权重长度512而导致报错,这种情况下由于没有网络层,所以观察起来并不是特别的直观,这里我们将对应的权重转换为网络层,这样报错比较直观
定义的网络层如下:

self.position_embeddings_layer = keras.layers.Embedding(
    input_dim = self.max_position_embeddings,
    output_dim = self.embedding_size,
    mask_zero = self.mask_zero,
    name = "position_embeddings"
)

接下来经过网络的embedding层进行相应的转换

position_ids = K.arange(0,seq_len,dtype='int32')[None]
position_embeddings = self.position_embeddings_layer(position_ids)

最后计算相应的results的结果

results = word_embeddings+position_embeddings

此时这里会相应的报错
报错内容截图由此可以分析出来最大长度540超出了当前指定的长度512的内容

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值