Реализация BERT в keras с TF_HUB

Я пытался реализовать модель Google Bert в tenorflow-keras, используя тензорный хаб. Для этого я разработал специальный слой с керасом "Bertlayer". Теперь проблема в том, что когда я компилирую модель keras, она продолжает показывать, что

AttributeError: объект 'Bertlayer' не имеет атрибута '_keras_style'

Не знаю, где я ошибаюсь и что такое атрибут _keras_style, помогите найти ошибку в коде.

Это ссылка github на полный код: https://github.com/PradyumnaGupta/BERT/blob/master/Untitled21.ipynb

class BertLayer(tf.layers.Layer):
    def __init__(self, n_fine_tune_layers=10, **kwargs):
        self.n_fine_tune_layers = n_fine_tune_layers
        self.trainable = True
        self.output_size = 768
        super(BertLayer, self).__init__(**kwargs)

    def build(self, input_shape):
        self.bert = hub.Module(
            bert_path,
            trainable=self.trainable,
            name="{}_module".format(self.name)
        )

        trainable_vars = self.bert.variables

        # Remove unused layers
        trainable_vars = [var for var in trainable_vars if not "/cls/" in var.name]

        # Select how many layers to fine tune
        trainable_vars = trainable_vars[-self.n_fine_tune_layers :]

        # Add to trainable weights
        for var in trainable_vars:
            self._trainable_weights.append(var)

        for var in self.bert.variables:
            if var not in self._trainable_weights:
                self._non_trainable_weights.append(var)

        super(BertLayer, self).build(input_shape)

    def call(self, inputs):
        inputs = [K.cast(x, dtype="int32") for x in inputs]
        input_ids, input_mask, segment_ids = inputs
        bert_inputs = dict(
            input_ids=input_ids, input_mask=input_mask, segment_ids=segment_ids
        )
        result = self.bert(inputs=bert_inputs, signature="tokens", as_dict=True)[
            "pooled_output"
        ]
        return result

    def compute_output_shape(self, input_shape):
        return (input_shape[0], self.output_size)

person Prady_venom    schedule 29.05.2019    source источник


Ответы (1)


Итак, версия tenorflow 1. * немного вводит в заблуждение. На самом деле он имеет 2 базовых класса, называемых Layer. Один - тот, который вы используете. Он предназначен для реализации оберток ярлыков над обычными операциями TF. Другой from tensorflow.keras.layers import Layer предназначен для моделей и последовательностей, подобных Keras.

Судя по вашей ошибке, вы используете керасы / модели для дальнейшего обучения.

Вам, вероятно, следует начать формирование вашего слоя с keras.layers.Layer вместо tf.layers.Layer.

person y.selivonchyk    schedule 30.05.2019
comment
Большое спасибо .... это только что решило мою проблему !! Извините за поздний ответ !!! - person Prady_venom; 04.06.2019