Использование столбцов функций с функциональным API Keras

В TensorFlow 2.0 Keras поддерживает столбцы функций, открывая возможность представлять структурированные данные с использованием стандартных методов проектирования функций, таких как встраивание, разделение на сегменты и пересечение функций. В этой статье я сначала покажу вам простой пример использования функционального API для построения модели, использующей столбцы функций. Затем я обновлю код, чтобы построить полную и глубокую модель.

Чтобы статья была краткой, я сосредоточусь только на модели, но вы можете увидеть полную записную книжку (включая чтение данных с помощью tf.data) на GitHub.

1. При необходимости установите TensorFlow 2.0.

Код здесь предполагает, что вы используете TensorFlow 2.0. pip установите его в Colab, используя:

!pip install -q tensorflow==2.0.0-alpha0`

или используйте Notebooks Cloud AI Platform (CAIP), чтобы получить экземпляр TensorFlow 2.0 Jupyter:

2. Создайте столбцы функций

Создайте столбцы функций для каждого поля ввода:

real = {
    colname : fc.numeric_column(colname) \
          for colname in \
            (’dep_delay,taxiout,distance’).split(’,’)
}
sparse = {
      'origin' : fc.categorical_column_with_hash_bucket(’origin’, hash_bucket_size=1000),
      'dest'   : fc.categorical_column_with_hash_bucket(’dest’, hash_bucket_size=1000)
}

Здесь я создаю числовые столбцы для полей с плавающей запятой и столбцы хешированных категорий для категориальных полей.

3. Создайте входные данные для модели.

Для каждого из входов также создайте слой ввода Keras, не забудьте установить dtype и имя для каждого из полей ввода:

inputs = {
    colname : tf.keras.layers.Input(name=colname, shape=(), dtype='float32') \
          for colname in real.keys()
}
inputs.update({
    colname : tf.keras.layers.Input(name=colname, shape=(), dtype='string') \
          for colname in sparse.keys()
})

4. Делайте встраивание, горячее кодирование и т. Д.

Чтобы использовать категориальную переменную в модели глубокого обучения, мы должны ее закодировать. Редкая переменная должна быть либо встроена, либо закодирована в горячем режиме. Итак, давайте сделаем и то, и другое:

embed = {
       'embed_{}'.format(colname) : fc.embedding_column(col, 10) \
          for colname, col in sparse.items()
}
real.update(embed)
# one-hot encode the sparse columns
sparse = {
    colname : fc.indicator_column(col) \
          for colname, col in sparse.items()
}

5. Создайте модель DNN с помощью функционального API.

Ключевым моментом является создание слоя DenseFeatures для преобразования входных данных с использованием столбцов функций:

deep = tf.keras.layers.DenseFeatures(real.values())(inputs)
deep = tf.keras.layers.Dense(64, activation='relu')(deep)
deep = tf.keras.layers.Dense(16, activation='relu')(deep)
output = tf.keras.layers.Dense(1, activation='sigmoid')(deep)
model = tf.keras.Model(inputs, output)

Вот и все! Вызовите model.fit () и т. Д. Как обычно.

6. Создайте широкую и глубокую сеть с помощью функционального API Keras.

Если вы хотите построить широкую и глубокую сеть, вы хотите подключить разреженные объекты непосредственно к выходному узлу, но передать реальные объекты через набор плотных слоев. Вот модельная архитектура, которая сделает это:

def wide_and_deep_classifier(inputs, linear_feature_columns, dnn_feature_columns, dnn_hidden_units):
    deep = tf.keras.layers.DenseFeatures(dnn_feature_columns)(inputs)
    for numnodes in dnn_hidden_units:
        deep = tf.keras.layers.Dense(numnodes, activation='relu')(deep)        
    wide = tf.keras.layers.DenseFeatures(linear_feature_columns)(inputs)
    both = tf.keras.layers.concatenate([deep, wide])
    output = tf.keras.layers.Dense(1, activation='sigmoid')(both)
    model = tf.keras.Model(inputs, output)
    model.compile(optimizer='adam',
                  loss='binary_crossentropy',
                  metrics=['accuracy'])
    return model
model = wide_and_deep_classifier(inputs, sparse.values(), real.values(), [64, 16])

Конечно, поскольку это Keras, вы можете легко добавить в модель выпадение, пакетную нормализацию и т. Д.

Наслаждаться!

Ресурсы:

  1. Смотрите полную записную книжку на GitHub.
  2. Прочтите мою книгу о Data Science on GCP