最近在运行程序的时候,发现一个这样的报错内容
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的内容