編程接口的新動態:用 TensorFlow 高層 API 來構建機器學習模型 丨 Google 開發者大會 2018

Google 開發者大會 (Google Developer Days,簡稱 GDD) 是展現 Google 最新開發者產品和平臺的全球盛會,旨在幫助你快速開發優質應用,發展和留住活躍用戶羣,充分利用各類工具得到更多收益。2018 Google 開發者大會於 9 月 20 日和 21 日於上海舉辦。👉Google 開發者大會 2018 掘金專題bash

2018 年 9 月 21 日 ,馮亦菲(Google Brain 軟件工程師)帶來一場《用 TensorFlow 高層 API 來構建機器學習模型》的演講,本文將對演講作一個回顧。機器學習

如何機器學習模型

構建機器學習模型是一個按部就班的過程:

  • 首先獲取數據集,並明確機器學習所要解決的問題;
  • 接下來處理數據集,讓咱們的模型可以快速的理解形式;
  • 緊接着搭建機器學習模型的結構,而且訓練評估咱們的模型;
  • 最後,當模型達到咱們預先設定的目標,就能夠將其打包投入到生產環境中去。

機器學習問題

推測天然保護區類型

本例中的所使用的數據集爲科羅拉多州森林植被數據集。該數據集記錄了美國科羅拉多州不一樣地塊的森林植被類型,每一個樣本包含了描述每塊土地的若干特徵,包括海拔、坡度、到水源的距離、遮陽狀況和土壤類型,而且隨同給出了地塊的已知森林植被類型。數據集下載ide

數據樣本

按照連接地址下載的原始數據集是以逗號分割、每行有55個整數列,以下圖: 函數

每一列所表明的含義以下圖所示: 工具

其中,上圖中橘黃色方框選中的區域就是咱們這次想要推測的天然保護區類型。

使用 TensorFlow構建模型

在瞭解咱們全部的數據集以後,能夠着手使用 TensorFlow 來構建咱們的模型。學習

首先 import tensorflowui

import tensorflow as tf
複製代碼

接下來,馮亦菲推薦使用 Eager Execution 當即執行lua

tf.enable_eager_execution()
複製代碼
eager 執行模型

Eager Execution 的優勢以下:

  • 快速調試即刻的運行錯誤並經過 Python 工具進行整合
  • 藉助易於使用的 Python 控制流支持動態模型
  • 爲自定義和高階梯度提供強大支持
  • 適用於幾乎全部可用的 TensorFlow 運算

使用tensorflow 提供的 Dataset 加載數據.咱們下載的數據格式爲 .csv,因此咱們用的是 CsvDatasetspa

dataset = tf.contrib.data.CsvDataset(
    filenames = ['covtype.csv.train']
    record_defaults = [tf.int32] * 55)
print(list(dataset.take(1)))
複製代碼

查看 dataset 中第一行數據。 3d

上圖中雖然咱們能夠看出每一行原始數據的含義,可是想要帶入到機器學習的模型中,咱們還須要對數據進行解析。

解析原始數據集

col_names = ['elevation','aspect','slope'...]
//特徵名稱

def _parse_csv_row(*vals):
    soil_type_t = tf.convert_to_tensor(vals[14:54])
    //土壤類型是一個特徵,而不是 40 個單獨的特徵
    
    feat_vals = vals[:10] + (soil_type_t, vals[54])
    //從新組成 12 個特徵
    
    features = dict(zip(col_names, feat_vals))
    //給每一個特徵取一個名稱
    
    class_label = tf.argmax(vals[10:14], axis = 0)
    //生成天然保護區標籤,在原始數據集中它的一個長度爲 4
    return features, class_label
複製代碼

解析數據

dataset = dataset.map(_parse_csv_row).batch(64)
//利用解析函數解析,並以 64 爲單位對訓練集進行分組

print(list(dataset.take(1)))
複製代碼

由於咱們使用的是 Eager 執行模式,因此咱們能夠直接打印查看數據,以下圖所示:

定義數據特徵

使用 feature_column, 將原始數值變成模型可理解的數值。

# Cover_Type / integer / 1 to 7
cover_type = tf.keras.feature_column.
    categorical_column_with_identity(
        'cover_type', num_buckets=8
    )

//把離散的類別,變成對模型有意義的連續的數值
cover_embedding = tf.kears.feature_column.
    embedding_column(cover_type,dimension = 10)

numeric_features = [tf.keras.feature_column.
    numeric_column(feat) for feat in numeric_cols]

soil_type = tf.keras.feature_column.
    numeric_column(soil_type, shape = (40,))

columns = numeric_features + [
    soil_type, cover_embedding]

feature_layer = tf.keras.feature_column.
    FeatureLayer(columns)
複製代碼

構造模型

這裏咱們使用的是 keras API 來搭建咱們的模型,經過 keras 能夠像搭積木同樣來構造模型。

model = tf.keras.Sequential([
    feature_layer,
    tf.keras.layers.Dense(256, activation = tf.nn.relu),
    tf.keras.layers.Dense(16, activation = tf.nn.relu),
    tf.keras.layers.Dense(8, activation = tf.nn.relu),
    tf.keras.layers.Dense(4, activation = tf.nn.softmax)
])

model.fit(dataset,steps_per_epoch = NUM_TRAIN_EXAMPLES/64)
複製代碼

訓練結果以下:

驗證模型

加載驗證數據
def load_data(*filenames):
    dataset = tf.contrib.data.CsvDataset(
    filenames,record_defaults)
    dataset = dataset.map(_parse_csv_row)
    dataset = dataset.batch(64)
    return dataset
複製代碼
驗證
test_data = load_data('covtype.csv.test')

loss, accury = model.evaluate(
    test_data,
    steps = 50
)

print(loss, accury)
複製代碼

損失值與準去率以下圖所示:

輸出模型

若是驗證結果達到咱們所設定的要求,能夠利用 SavedModel 打包。

export_dir = tf.contrib.saved_model.
    save_keras_model(model, 'keras_nn')

//從新訓練已訓練的模型
restored_model = tf.contrib.saved_model.
    save_keras_model(export_dir)
複製代碼

至此咱們完成了構造機器學習模型的完整流程。在咱們平常的生產環境中,不存在一次構建完美模型的狀況。因此,咱們能夠根據上面構建模型的 5 個步驟,就單個步驟或多這個步驟進行改進。例如,咱們能夠得到跟多原始數據,以提升模型的廣泛性等等。

Wide & Deep 模型

前面咱們使用的是 keras 模型,下面咱們使用 Wide & Deep 模型就實現。

model = tf.estimator.DNNLinearCombinedClassifier(
    linear_feature_columns = [cover_type, soil_type],
    dnn_feature_columns = numeric_features,
    dnn_hidden_unites = [256, 16, 8]
    n_classes = 4
)

//訓練
model.train(
    input_fn = lambda: load_data('covtype.csv.train'))
//驗證
model.evaluate(
    input_fn = lambda: load_data('covtype.csv.test'))
    
//輸出
features_sample = list(dataset.take(1))[0][0]
input_receiver_fn = tf.estimator.export.
    bulid_raw_serving_input_receiver_fn(
    features_sample)

//從新訓練已訓練的模型    
model.export_saved_model(
    export_dir_base = 'wide_deep',
    serving_input_receiver_fn = input_receiver_fn)
複製代碼

總結

以上就是本次演講的所有內容,但願對你們有所幫助。 閱讀更多 Google 開發者大會 2018 技術乾貨
相關文章
相關標籤/搜索