具有Keras的ELMo嵌入层中可变_范围的问题

具有Keras的ELMo嵌入层中可变_范围的问题,keras,nlp,tensorflow2.0,transfer-learning,elmo,Keras,Nlp,Tensorflow2.0,Transfer Learning,Elmo,我正在尝试使用tensorflow gpu==2.0.0-rc0为Keras中的模型使用自定义ElmoEmbeddingLayer 这是一个类: class ElmoEmbeddingLayer(Layer): def __init__(self, trainable=True, output_mode="default", **kwargs): assert output_mode in ["default", "word_emb", "lstm_outputs1",

我正在尝试使用tensorflow gpu==2.0.0-rc0为Keras中的模型使用自定义ElmoEmbeddingLayer

这是一个类:

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)
这是我的型号:

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)
然而,当我尝试拟合我的模型时,我遇到了这个错误,我该如何修复它?


运行时错误:变量\u scope elmo\u embedding\u layer\u 14\u module/未使用,但相应的名称\u scope已被使用。

我认为您可以更改tensorflow的版本,因为它在2.0中无法正常工作。所以你可以把它降级

!pip install tensorflow==1.15
!pip install "tensorflow_hub>=0.6.0"
!pip3 install tensorflow_text==1.15

它对我很有用。

我想你能做的就是更改tensorflow的版本,因为它在2.0中不起作用。所以你可以把它降级

!pip install tensorflow==1.15
!pip install "tensorflow_hub>=0.6.0"
!pip3 install tensorflow_text==1.15
这对我有用