zoukankan      html  css  js  c++  java
  • 机器学习入门04

    原文链接: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: ", "
    ", 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 会为您创建会话对象。

  • 相关阅读:
    网络流与线性规划24题 之 餐巾计划问题
    待刷题目分类(一)
    bzoj1787 [Ahoi2008]Meet 紧急集合
    Hoj2634 How to earn more?
    poj3281 Dining
    浅谈数论(三)水仙花数
    poj1637 Sightseeing tour
    动态规划的思考(1)
    网络流-最大流问题 ISAP 算法解释(转自Renfei Song's Blog)
    poj1273 Drainage Ditches
  • 原文地址:https://www.cnblogs.com/anliven/p/10264318.html
Copyright © 2011-2022 走看看