Использование столбцов функций с функциональным 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, вы можете легко добавить в модель выпадение, пакетную нормализацию и т. Д.
Наслаждаться!
Ресурсы:
- Смотрите полную записную книжку на GitHub.
- Прочтите мою книгу о Data Science on GCP