GPLinker icon indicating copy to clipboard operation
GPLinker copied to clipboard

请教苏神,将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

Open prigioni opened this issue 1 year ago • 0 comments

基本信息 你使用的操作系统: 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 期待您的答复,谢谢!

prigioni avatar Jan 18 '25 11:01 prigioni