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)
复制代码
前面咱们使用的是 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)
复制代码