【问题标题】:Implementation of BERT in keras with TF_HUB使用 TF_HUB 在 keras 中实现 BERT
【发布时间】:2019-05-29 19:42:07
【问题描述】:

我试图使用 tensorflow hub 在 tensorflow-keras 中实现 Google Bert 模型。为此,我设计了一个自定义 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)

【问题讨论】:

  • 对不起,我使用相同的代码,但出现 NameError: name 'bert_path' is not defined
  • 您需要声明一个包含路径的全局变量bert_path。您可以从 hub 获取路径。

标签: tensorflow keras neural-network deep-learning tf.keras


【解决方案1】:

因此,tensorflow 版本 1.* 有点误导。它实际上有 2 个基类,称为 Layer。一 - 您正在使用的那个。它旨在在常规 TF 操作上实现快捷包装。另一个from tensorflow.keras.layers import Layer 用于类似 Keras 的模型和序列。

根据您的错误判断,您正在使用 keras/models 进行进一步训练。

您可能应该开始从keras.layers.Layer 而不是tf.layers.Layer 派生层。

【讨论】:

  • 非常感谢....刚刚解决了我的问题!!抱歉回复晚了!!!
猜你喜欢
  • 2020-10-27
  • 1970-01-01
  • 2019-01-07
  • 1970-01-01
  • 2017-03-07
  • 2017-06-28
  • 2019-07-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多