具有Keras的ELMo嵌入层中可变_范围的问题
我正在尝试使用tensorflow gpu==2.0.0-rc0为Keras中的模型使用自定义ElmoEmbeddingLayer 这是一个类:具有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",
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
这对我有用