Недавно выпущенный Tensorflow hub предоставляет простой интерфейс для использования существующих моделей машинного обучения для трансферного обучения. Однако иногда полезно запустить Keras и быстро создать прототип модели. С некоторыми исправлениями легко интегрировать модель концентратора Tensorflow с Keras!
Вложения ELMo, разработанные в Allen NLP, являются одной из многих замечательных предварительно обученных моделей, доступных на Tensorflow Hub. Вложения ELMo изучаются из внутреннего состояния двунаправленного LSTM и представляют контекстные особенности входного текста. Было показано, что он превосходит вложения GloVe и Word2Vec в широком спектре задач НЛП.
Вот небольшой фрагмент кода, который наша команда из Strong Analytics недавно использовала для прототипирования модели НЛП с использованием современных встраиваний ELMo в Keras.
Сначала загружаем некоторые данные:
# Load all files from a directory in a DataFrame.
def load_directory_data(directory):
data = {}
data["sentence"] = []
data["sentiment"] = []
for file_path in os.listdir(directory):
with tf.gfile.GFile(os.path.join(directory, file_path), "r") as f:
data["sentence"].append(f.read())
data["sentiment"].append(re.match("\d+_(\d+)\.txt", file_path).group(1))
return pd.DataFrame.from_dict(data)
# Merge positive and negative examples, add a polarity column and shuffle.
def load_dataset(directory):
pos_df = load_directory_data(os.path.join(directory, "pos"))
neg_df = load_directory_data(os.path.join(directory, "neg"))
pos_df["polarity"] = 1
neg_df["polarity"] = 0
return pd.concat([pos_df, neg_df]).sample(frac=1).reset_index(drop=True)
# Download and process the dataset files.
def download_and_load_datasets(force_download=False):
dataset = tf.keras.utils.get_file(
fname="aclImdb.tar.gz",
origin="http://ai.stanford.edu/~amaas/data/sentiment/aclImdb_v1.tar.gz",
extract=True)
train_df = load_dataset(os.path.join(os.path.dirname(dataset),
"aclImdb", "train"))
test_df = load_dataset(os.path.join(os.path.dirname(dataset),
"aclImdb", "test"))
return train_df, test_df
# Reduce logging output.
tf.logging.set_verbosity(tf.logging.ERROR)
train_df, test_df = download_and_load_datasets()
train_df.head()
Далее мы обрабатываем наши данные. Обратите внимание: чтобы использовать строки в качестве входных данных для модели Keras, мы создаем массив объектов. Я ограничил эти данные первыми 150 словами для памяти (вложения ELMo требуют больших вычислительных ресурсов, поэтому используйте графический процессор!).
# Create datasets (Only take up to 150 words) train_text = train_df['sentence'].tolist() train_text = [' '.join(t.split()[0:150]) for t in train_text] train_text = np.array(train_text, dtype=object)[:, np.newaxis] train_label = train_df['polarity'].tolist() test_text = test_df['sentence'].tolist() test_text = [' '.join(t.split()[0:150]) for t in test_text] test_text = np.array(test_text, dtype=object)[:, np.newaxis] test_label = test_df['polarity'].tolist()
Чтобы создать вложения Elmo в Keras, мы сначала должны создать настраиваемый слой, чтобы гарантировать, что веса внедрения можно обучить:
class ElmoEmbeddingLayer(Layer): def __init__(self, **kwargs): self.dimensions = 1024 self.trainable = True 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', )['default'] return result def compute_mask(self, inputs, mask=None): return K.not_equal(inputs, '--PAD--') def compute_output_shape(self, input_shape): return (input_shape[0], self.dimensions)
Теперь мы можем построить и обучить нашу модель с помощью ElmoEmbeddingLayer:
input_text = layers.Input(shape=(1,), dtype=tf.string) embedding = ElmoEmbeddingLayer()(input_text) dense = layers.Dense(256, activation='relu')(embedding) pred = layers.Dense(1, activation='sigmoid')(dense) model = Model(inputs=[input_text], outputs=pred) model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) model.summary() model.fit(train_text, train_label, validation_data=(test_text, test_label), epochs=5, batch_size=32)
Вот и все! На tenorflow hub есть много отличных моделей, обязательно поэкспериментируйте со всеми!
См. Записную книжку IPython здесь: https://github.com/strongio/keras-elmo/blob/master/Elmo%20Keras.ipynb ’
Хотите поработать над проблемами НЛП, машинного обучения и искусственного интеллекта в различных отраслях с командой ведущих специалистов по данным в Чикаго? Мы нанимаем талантливых специалистов по обработке данных и инженеров!
Узнайте больше на strong.io и подайте заявку на careers.strong.io