机器学习入门04 - 使用TensorFlow的起始步骤 (First Steps with TensorFlow)

原文链接:https://developers.google.com/machine-learning/crash-course/first-steps-with-tensorflow/

1- 工具包

TensorFlow工具包的层次结构

  • Estimator (tf.estimator): 高级 OOP API,与scikit-learn API兼容
  • tf.layers/tf.losses/tf.metrics: 用于常见模型组件的库
  • TensorFlow: 低级API

TensorFlow由“图协议缓冲区”和“执行(分布式)图的运行时”两个组件组成,这两个组件类似于Java编译器和JVM。
类似JVM,TensorFlow也能实施在多个硬件平台(CPU 和 GPU)上。

应该使用哪个 API?

  • 应该使用能够解决问题的最高级抽象层。
  • 较高级别的抽象层更易于使用,但(设计方面)不够灵活。建议您先从最高级 API 入手,让所有组件正常运作起来。
  • 如果希望在某些特殊建模方面能够更加灵活一些,则可以降低一个级别。
  • 请注意,每个级别都是使用低级 API 构建的,因此降低层次结构级别应该比较直观。

在MLCC中将使用 tf.estimator 对模型进行编码,来完成大部分练习。

2- 练习

按照指定顺序运行以下三个练习

  1. Pandas 简介:Pandas 是用于进行数据分析和建模的重要库,广泛应用于 TensorFlow 编码。该教程提供了学习本课程所需的全部 Pandas 信息。如果已了解 Pandas,则可以跳过此练习。
  2. 使用 TensorFlow 的起始步骤:此练习介绍了线性回归。
  3. 合成特征和离群值:此练习介绍了合成特征以及输入离群值带来的影响。

MLCC中的常用超参数

  • steps:训练迭代的总次数。一步计算一批样本产生的损失,然后使用该值修改一次模型的权重。
  • batch siz:单步的样本数量(随机选择)。例如,SGD 的批次大小为 1。
    $total\,number\,of\,trained\,examples = batch\,size * steps$

MLCC中的方便变量

  • periods:控制报告的粒度。

例如,如果 periods 设为 7 且 steps 设为 70,则练习将每 10 步输出一次损失值(即 7 次)。

与超参数不同,不希望修改 periods 的值。

请注意,修改 periods 不会更改模型所学习的规律。

        $number\,of\,training\,examples\,in\,each\,period = \frac{batch\,size * steps} {periods}$

2.1- Pandas简介

主要数据结构

  • DataFrame: 数据框架是用于数据操控的一种常用抽象实现形式,可以理解为一个关系型数据表格,其中包含多个行和已命名的列。
  • Series: 单一列。DataFrame 中包含一个或多个 Series,每个 Series 均有一个名称。

示例讲解

# coding=utf-8
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

print("version: ", pd.__version__)

# ### 显示设置
# 默认情况下,如果DataFrame的行列数量太多,print将只显示部分内容
pd.set_option('display.max_columns', None)  # 显示所有列
pd.set_option('display.max_rows', None)  # 显示所有行
pd.set_option('max_colwidth', 100)  # 设置value的显示长度为100,默认为50

# ### 基本概念
city_names = pd.Series(['San Francisco', 'San Jose', 'Sacramento'])  # 构建Series对象
population = pd.Series([852469, 1015785, 485199])  # 构建Series对象
maps = pd.DataFrame({'City name': city_names, 'Population': population})  # 创建DataFrame对象
print("DataFrame: ", "\n", maps)  # 如果Series在长度上不一致,系统会用特殊的NA/NaN值填充缺失的值

california_housing_dataframe = pd.read_csv("Zcalifornia_housing_train.csv", sep=",")  # 将整个文件加载到DataFrame
info = california_housing_dataframe.describe()  # 使用DataFrame.describe来显示关于DataFrame的统计信息
print(info)
info_head = california_housing_dataframe.head()  # 显示DataFrame的前几个记录
print(info_head)

hist = california_housing_dataframe.hist('housing_median_age')  # 绘制图表:使用DataFrame.hist快速了解一个列中值的分布
print(hist)
plt.show()  # 显示图表

# ### 访问数据
# 以Python的dict/list方式访问DataFrame数据
# 文档: http://pandas.pydata.org/pandas-docs/stable/indexing.html
cities = pd.DataFrame({'City name': city_names, 'Population': population})
print(type(cities['City name']), type(cities[0:2]), type(cities['City name'][1]))
print(cities)
print(cities['City name'])
print(cities[0:2])
print(cities['City name'][1])

# ### 操控数据
print(population / 1000)  # 可以向Series应用Python的基本运算指令
print(np.log(population))  # Series对象可用作大多数NumPy函数的参数
print(population.apply(lambda val: val > 1000000))  # 创建一个population是否超过100万的新Series对象
# 使用Series.apply进行复杂的单列转换,Series.apply将以参数形式接受 lambda 函数,而该函数会应用于每个值
cities['Area square miles'] = pd.Series([46.87, 176.53, 97.92])  # 向现有DataFrame添加Series
cities['Population density'] = cities['Population'] / cities['Area square miles']  # 添加Series
cities['wide_saint'] = (cities['Area square miles'] > 50) \
                                       & cities['City name'].apply(lambda name: name.startswith('San'))  # 添加Series
# 注意:布尔值Series是使用“按位”而非传统布尔值“运算符”组合的,因此执行逻辑与时,应使用&,而不是and
print(cities)

# ### 索引
# 文档:http://pandas.pydata.org/pandas-docs/stable/indexing.html#index-objects
# Series和DataFrame对象定义了index属性,该属性会向每个Series项或DataFrame行赋一个标识符值
# 默认情况下,在构造时,pandas会赋可反映源数据顺序的索引值
# 索引值在创建后是稳定的,不会因为数据重新排序而发生改变
print(city_names.index)
print(cities.index)
# reindex方法
# 文档:http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.reindex.html
print(cities.reindex([2, 0, 1]))  # 调用DataFrame.reindex来手动重新排列各行的顺序
cities.reindex(np.random.permutation(cities.index))  # 将cities.index传递至NumPy的random.permutation函数,随机排列其值的位置
print(cities)
# reindex方法允许使用未包含在原始DataFrame索引值中的索引值,reindex会为此类“丢失的”索引添加新行,并在所有对应列中填充NaN值
print(cities.reindex([0, 4, 5, 2]))

 

2.2- 使用TensorFlow的起始步骤

xxx

 

2.3- 合成特征和离群值

xxx

 

3- 关键词

Estimator
tf.Estimator 类的一个实例,用于封装负责构建 TensorFlow 图并运行 TensorFlow 会话的逻辑。
可以创建自定义 Estimator(https://www.tensorflow.org/guide/custom_estimators),也可以实例化其他人预创建的 Estimator。

图 (graph)
TensorFlow 中的一种计算规范。
图中的节点表示操作。边缘具有方向,表示将某项操作的结果(一个张量)作为一个操作数传递给另一项操作。
可以使用 TensorBoard 直观呈现图。

张量 (Tensor)
TensorFlow 程序中的主要数据结构。
张量是 N 维(其中 N 可能非常大)数据结构,最常见的是标量、向量或矩阵。
张量的元素可以包含整数值、浮点值或字符串值。

操作 (op, Operation)
TensorFlow 图中的节点。
在 TensorFlow 中,任何创建、操纵或销毁张量的过程都属于操作。
例如,矩阵相乘就是一种操作,该操作以两个张量作为输入,并生成一个张量作为输出。

会话 (tf.session)
封装了 TensorFlow 运行时状态的对象,用于运行全部或部分图。
在使用底层 TensorFlow API 时,您可以直接创建并管理一个或多个 tf.session 对象。
在使用 Estimator API 时,Estimator 会为您创建会话对象。

 

posted @ 2019-01-13 22:20  Anliven  阅读(673)  评论(0编辑  收藏  举报