Google 開發者大會 (Google Developer Days,簡稱 GDD) 是展現 Google 最新開發者產品和平臺的全球盛會,旨在幫助你快速開發優質應用,發展和留住活躍用戶羣,充分利用各類工具得到更多收益。2018 Google 開發者大會於 9 月 20 日和 21 日於上海舉辦。👉Google 開發者大會 2018 掘金專題bash
2018 年 9 月 21 日 ,馮亦菲(Google Brain 軟件工程師)帶來一場《用 TensorFlow 高層 API 來構建機器學習模型》的演講,本文將對演講作一個回顧。機器學習
本例中的所使用的數據集爲科羅拉多州森林植被數據集。該數據集記錄了美國科羅拉多州不一樣地塊的森林植被類型,每一個樣本包含了描述每塊土地的若干特徵,包括海拔、坡度、到水源的距離、遮陽狀況和土壤類型,而且隨同給出了地塊的已知森林植被類型。數據集下載ide
按照連接地址下載的原始數據集是以逗號分割、每行有55個整數列,以下圖: 函數
每一列所表明的含義以下圖所示: 工具
其中,上圖中橘黃色方框選中的區域就是咱們這次想要推測的天然保護區類型。在瞭解咱們全部的數據集以後,能夠着手使用 TensorFlow 來構建咱們的模型。學習
首先 import tensorflow
ui
import tensorflow as tf
複製代碼
接下來,馮亦菲推薦使用 Eager Execution
當即執行lua
tf.enable_eager_execution()
複製代碼
使用tensorflow
提供的 Dataset
加載數據.咱們下載的數據格式爲 .csv
,因此咱們用的是 CsvDataset
。spa
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 個步驟,就單個步驟或多這個步驟進行改進。例如,咱們能夠得到跟多原始數據,以提升模型的廣泛性等等。
前面咱們使用的是 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)
複製代碼