请教苏神,将GlobalPointer函数放到duee_v1.py中会报错,return sequence_masking(logits, mask, -np.inf, [2, 3], tril_mask) TypeError: sequence_masking() takes from 2 to 4 positional arguments but 5 were given
基本信息 你使用的操作系统: Linux 你使用的Python版本: 3.7 你使用的Tensorflow版本: 1.14 你使用的Keras版本: 2.3.1 你使用的bert4keras版本: 0.11.3 你加载的预训练模型:BERT
import json import numpy as np from itertools import groupby from bert4keras.backend import keras, K from bert4keras.backend import sparse_multilabel_categorical_crossentropy from bert4keras.backend import apply_rotary_position_embeddings from bert4keras.backend import align, sequence_masking from bert4keras.tokenizers import Tokenizer from bert4keras.models import build_transformer_model from bert4keras.optimizers import Adam from bert4keras.snippets import sequence_padding, DataGenerator from bert4keras.snippets import open, to_array from tqdm import tqdm from bert4keras.layers import Layer, Dense, SinusoidalPositionEmbedding from bert4keras.backend import recompute_grad from keras import initializers, activations
class GlobalPointer(Layer): def init( self, heads, head_size, RoPE=True, use_bias=True, tril_mask=True, kernel_initializer='lecun_normal', **kwargs ): super(EGlobalPointer, self).init(**kwargs) self.heads = heads self.head_size = head_size self.RoPE = RoPE self.use_bias = use_bias self.tril_mask = tril_mask self.kernel_initializer = initializers.get(kernel_initializer)
def build(self, input_shape):
super(GlobalPointer, self).build(input_shape)
self.dense = Dense(
units=self.head_size * self.heads * 2,
use_bias=self.use_bias,
kernel_initializer=self.kernel_initializer
)
def compute_mask(self, inputs, mask=None):
return None
@recompute_grad
def call(self, inputs, mask=None):
# 输入变换
inputs = self.dense(inputs)
import tensorflow as tf
inputs = tf.split(inputs, self.heads, axis=-1)
inputs = K.stack(inputs, axis=-2)
qw, kw = inputs[..., :self.head_size], inputs[..., self.head_size:]
# RoPE编码
if self.RoPE:
pos = SinusoidalPositionEmbedding(self.head_size, 'zero')(inputs)
qw, kw = apply_rotary_position_embeddings(pos, qw, kw)
# 计算内积
logits = tf.einsum('bmhd,bnhd->bhmn', qw, kw) / self.head_size**0.5
# 排除下三角
if self.tril_mask:
tril_mask = tf.linalg.band_part(K.ones_like(logits[0, 0]), 0, -1)
tril_mask = K.cast(tril_mask, 'bool')
else:
tril_mask = None
# 返回最终结果
return sequence_masking(logits, mask, -np.inf, [2, 3], tril_mask)
def compute_output_shape(self, input_shape):
return (input_shape[0], self.heads, input_shape[1], input_shape[1])
def get_config(self):
config = {
'heads': self.heads,
'head_size': self.head_size,
'RoPE': self.RoPE,
'use_bias': self.use_bias,
'tril_mask': self.tril_mask,
'kernel_initializer':
initializers.serialize(self.kernel_initializer),
}
base_config = super(GlobalPointer, self).get_config()
return dict(list(base_config.items()) + list(config.items()))
argu_output = GlobalPointer(heads=len(labels), head_size=64)(output) head_output = GlobalPointer(heads=1, head_size=64, RoPE=False)(output) tail_output = GlobalPointer(heads=1, head_size=64, RoPE=False)(output) outputs = [argu_output, head_output, tail_output] 报错: return sequence_masking(logits, mask, -np.inf, [2, 3], tril_mask) TypeError: sequence_masking() takes from 2 to 4 positional arguments but 5 were given 期待您的答复,谢谢!