Недавно выпущенный 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