Я пытаюсь использовать пользовательский слой ElmoEmbeddingLayer для моей модели в Керасе с tenorflow-gpu == 2.0.0-rc0.
Это класс:
class ElmoEmbeddingLayer(Layer):
def __init__(self, trainable=True, output_mode="default", **kwargs):
assert output_mode in ["default", "word_emb", "lstm_outputs1", "lstm_outputs2", "elmo"]
assert trainable in [True, False]
self.output_mode = output_mode
self.trainable = trainable
super(ElmoEmbeddingLayer, self).__init__(**kwargs)
def build(self, input_shape):
self.elmo = hub.Module('https://tfhub.dev/google/elmo/2', trainable=self.trainable,
name="{}_module".format(self.name))
self.trainable_weights += K.tf.trainable_variables(scope="^{}_module/.*".format(self.name))
super(ElmoEmbeddingLayer, self).build(input_shape)
def call(self, x, mask=None):
result = self.elmo(
K.squeeze(K.cast(x, tf.string), axis=1),
as_dict=True,
signature='default',
)['elmo']
return result
def compute_mask(self, inputs, mask=None):
return K.not_equal(inputs, '--PAD--')
def compute_output_shape(self, input_shape):
if self.output_mode == "default":
return (input_shape[0], 1024)
if self.output_mode == "word_emb":
return (input_shape[0], self.max_length, 512)
if self.output_mode == "lstm_outputs1":
return (input_shape[0], self.max_length, 1024)
if self.output_mode == "lstm_outputs2":
return (input_shape[0], self.max_length, 1024)
if self.output_mode == "elmo":
return (input_shape[0], self.max_length, 1024)
def get_config(self):
config = {
'output_mode': self.output_mode
}
return list(config.items())
И это моя модель:
def train_model(lstm_layers = 300, dropout_rate = 0.1, learning_rate = 0.01,
batch_s = 25, verbose = 0, save_model = bool(0), epchs = 10):
model = tf.keras.Sequential([
tf.keras.layers.Input(shape=(max_lenght,), dtype="string"),
ElmoEmbeddingLayer(output_mode="default", trainable=True),
#tf.keras.layers.Embedding(max_lenght+1 , embedding_dim, input_length=max_lenght),
#tf.keras.layers.Reshape((max_lenght, embedding_dim)),
#tf.keras.layers.Bidirectional(LSTM(int(lstm_layers))),
tf.keras.layers.Dropout(dropout_rate),
tf.keras.layers.Dense(1, activation='sigmoid')
])
model.summary()
adam=Adam(lr=learning_rate)
model.compile(loss='binary_crossentropy', optimizer=adam, metrics=['accuracy'])
history = model.fit(np.array(data_train), np.array(labels_train), epochs=epchs,
batch_size = int(batch_s), validation_data=(np.array(data_test), np.array(labels_test)), verbose = verbose)
Однако, когда я пытаюсь соответствовать своей модели, я получаю эту ошибку, как я могу ее исправить?
Ошибка Runtime: variable_scope elmo_embedding_layer_14_module / не использовалась, но соответствующий name_scope уже был занят.