【发布时间】: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