1

TPU を使用して Google の共同作業で BERT モデルを微調整しようとしています。しかし、私は常に次のエラーが発生します。

ValueError: 変数 (tf.Variable 'bert_layer_module/bert/encoder/layer_10/attention/output/LayerNorm/beta:0' shape=(768,) dtype=float32) は (tensorflow.python. 0x7f6a1fad3390 の distributed.tpu_strategy.TPUStrategyV1 オブジェクト)。これは、すべてのレイヤーまたはモデルまたはオプティマイザーが配布戦略の範囲外で作成されているわけではないことが原因である可能性が最も高いです。コードが次のようになっていることを確認してください。

strategy.scope() を使用:

モデル=_create_model()

モデル.コンパイル(...)

私のコードはこのノートブックに基づいています! 特定の問題に合わせて変更し、明らかにTPUで実行しようとしました。

明らかに範囲外で作成されたcostum Layer BertLayerがあります。

class BertLayer(tf.keras.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)

        # Add non-trainable weights
        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)

モデルの作成は次の場所で行われます。

def build_model(max_seq_length): 
    output_classes = train_labels[0].shape
    # Build model
    in_id = tf.keras.layers.Input(shape=(max_seq_length,), name="input_ids")
    in_mask = tf.keras.layers.Input(shape=(max_seq_length,), name="input_masks")
    in_segment = tf.keras.layers.Input(shape=(max_seq_length,), name="segment_ids")
    bert_inputs = [in_id, in_mask, in_segment]

    # Instantiate the custom Bert Layer defined above
    bert_output = BertLayer(n_fine_tune_layers=10)(bert_inputs)

    # Build the rest of the classifier 
    dense = tf.keras.layers.Dense(256, activation='relu')(bert_output)
    pred = tf.keras.layers.Dense(train_labels.shape[1], activation='sigmoid')(dense)

    model = tf.keras.models.Model(inputs=bert_inputs, outputs=pred)
    return model

model.compile を呼び出すとエラーが発生します

strategy = tf.distribute.experimental.TPUStrategy(
    tf.contrib.cluster_resolver.TPUClusterResolver(TPU_ADDRESS))
with strategy.scope():
  model = build_model(256)

  opt = tf.train.AdamOptimizer(0.001)
  model.compile(loss='binary_crossentropy', optimizer=opt)

私が理解しているように、BertLayer は実際にスコープ内で作成されていますが、私は keras と tensorflow に比較的慣れていないので、助けていただければ幸いです。私はテンソルフロー1.14に取り組んでいます

4

2 に答える 2

0

戦略スコープでモデル入力の形状を指定することを検討するには、次のいずれかを試すことができます。 1.model.build()モデルが作成された後に呼び出します。2.input_shapeでモデルの最初のレイヤーを定義します__init__()model(tensor)3.モデルが作成された後に呼び出すために、実際のテンソル(ones、zerosなど)を使用します。

とにかく、モデル入力の形状を指定してください。これは私にとってはうまくいきます。これがあなたを助けることを願っています。

于 2019-08-29T06:50:54.720 に答える