使用TensorFlow高級別的API進行編程


  這里涉及到的高級別API主要是使用Estimator類來編寫機器學習的程序,此外你還需要用到一些數據導入的知識。

為什么使用Estimator

  Estimator類是定義在tf.estimator.Estimator中的,你可以使用其中已經有的Estimator,叫做預創建的Estimator,也可以自定義Estimator。Estimator已經封裝了訓練(train),評估(evaluate),預測(predict),導出以供使用等方法。

  此外,Estimator會為我們提供諸如圖構建、創建session等管道工作,不用我們再做這些重復的工作。它還提供了安全的分布式訓練循環。相比於低級的API,我們可以把大部分的時間和精力放在處理數據、訓練模型、調整參數上面,而不是創建張量、構建圖、使用session運行張量上面。

使用Estimator的步驟

1:需要編寫一個數據輸入的函數input_fn

  input_fn是輸入函數,這個函數的作用在於對數據進行預處理,並且在模型train,predict,evaluate的時候給模型送進去數據。所以input_fn主要作用的時機在模型訓練、預測和評估的時候,在模型定義的時候不需要傳入輸入函數,而是傳入一個預定義的特征列。可以使用系統自帶的函數,可以編寫自定義的輸入函數。

使用系統自帶的數據輸入函數:

  系統自帶的輸入函數為tf.estimator.inputs.numpy_input_fn,它的輸入參數如下:

def numpy_input_fn(x,
                   y=None,
                   batch_size=128,
                   num_epochs=1,
                   shuffle=None,
                   queue_capacity=1000,
                   num_threads=1)

  x為numpy數組或者numpy數組的字典,當為numpy數組的時候,這個數組被當做單一的特征對待。

  一個例子如下,這個例子是tf.estimator Quickstart tutorial中的一段代碼:

import numpy as np

training_set = tf.contrib.learn.datasets.base.load_csv_with_header(
    filename=IRIS_TRAINING, target_dtype=np.int, features_dtype=np.float32)

train_input_fn = tf.estimator.inputs.numpy_input_fn(
    x={"x": np.array(training_set.data)},
    y=np.array(training_set.target),
    num_epochs=None,
    shuffle=True)

classifier.train(input_fn=train_input_fn, steps=2000)
 

自定義導入數據的函數:

  要自定義導入函數,要知道tensorflow中關於數據的概念,以及知道自定義的函數應該返回的值,下面我將梳理一下這里面的概念:

自定義函數的基本框架以及返回值

def my_input_fn():

    # 在這里進行數據的預處理...

    # ...返回兩個值 1) 一個由特征列和包含特征的Tensors組成的映射(字典) 2) 一個包含labels的Tensor
    return feature_cols, labels

  自定義函數需要返回兩個值,一個值是feature_cols,是一個字典,其中字典的key為特征的列名稱,字典的value為包含特征值的Tensor對象。labels是一個包含標簽值的Tensor對象。

tf.data.API對於數據的兩個抽象:

  使用tf.data.API來構建數據輸入的管道,幫助我們導入數據,無論是圖像,文本還是分布式的數據,都可以用它來完成。

  一個抽象的概念是tf.data.Dataset,一個Dataset是一個數據集,它是由一系列的元素組成的,每個元素的類型都是相同的。其中每個元素包含一個或者多個Tensor對象。我們可以以兩種方式來創建Dataset對象,一種方式是創建它的來源,比如使用Dataset.from_tensor_slices(),可以使用張量來創建Dataset對象,另外一種方式是運用轉換的方式,可以將一個Dataset來變成另外一個Dataset,比如Dataset.batch()。

  另外一個抽象的概念是tf.data.Iterator,它代表的是迭代器。表示的是如何從數據集里面取出元素,最簡答的迭代器是單次迭代器,Dataset.make_one_shot_iterator()可以創建單次迭代器。創建迭代器以后,可以使用Iterator.get_next()來獲取下一個元素。

其它的創建數據集的方法:

  Dataset.from_tensor()創建一個Dataset,並將傳入的Tensor當做一個元素。 Dataset.from_tensor_slices()會創建一個Dataset,並且將傳入的Tensor在第0維上面切面,分成一些列的元素。還可以使用TFRecordDataset來獲得磁盤上面TFRecord格式的數據。

其它的創建迭代器的方法:

  除了dataset.make_one_shot_iterator()這種單次迭代器以外,你還可以創建可初始化、可重新初始化、可饋送迭代器。

導入數據集的基本的工作機制:

1:創建Dataset對象 –> 2:將Dataset進行轉化 –> 3:創建迭代器 –> 4:用迭代器返回下一個元素。

  下面用一個例子來說明一下:

from tensorflow.python.data import Dataset
import numpy as np
def my_input_fn(features, targets, batch_size=1, shuffle=True, num_epochs=None):
    """自定義的輸入函數

    Args:
      features: 使用pandas中的DataFrame對象來表示的features
      targets: 使用pandas的taFrame對象表示的targets
      batch_size: 批次的大小
      shuffle: 是否將數據進行重新打亂
      num_epochs: 需要重復的epochs的數量,一個epochs代表一個訓練周期. None = repeat indefinitely
    Returns:
      下一批次數據的元組 (features, labels)
    """

    # 將pandas對象轉換為字典,其中字典的值為numpy的數組
    features = {key:np.array(value) for key,value in dict(features).items()}

    # 創建一個Dataset,並且設置好批次和重復的次數
    ds = Dataset.from_tensor_slices((features,targets)) # warning: 2GB limit
    ds = ds.batch(batch_size).repeat(num_epochs)

    # 是否進行數據擾動
    if shuffle:
        ds = ds.shuffle(10000)

    # 返回下個批次的數據
    features, labels = ds.make_one_shot_iterator().get_next()
    return features, labels

  上面自定義了數據導入的函數,使用Dataset.from_tensor_slices()來創建Dataset。然后使用batch、repeat、shuffle進行轉換。 接着創建迭代器,並且獲得下一個元素。

 

 

2:定義特征列

  使用tf.feature_column來標識特征名稱、類型和任何輸入預處理。

  特征列在原始數據和模型之間起到了連接的作用。在編寫模型的時候需要預先確定輸入數據的特征列。

  比如包含經度和維度兩個特征的特征列,它們都是數值類型,這個特征列在模型定義的時候需要傳入:

import tensorflow as tf
longitude = tf.feature_column.numeric_column('longitude')
latitude = tf.feature_column.numeric_column('latitude')
feature_column = [longitude, latitude]

inputs_to_model_bridge

特征列在原始數據與模型所需的數據之間架起了橋梁。

3:實例化相關的預創建的Estimator

  這個步驟就簡單了,以深度學習模型為例,運用上面創建的經緯度特征列,使用10*10的隱層創建一個深度神經網絡的回歸模型:

hidden_units = [10, 10]
dnn_regressor = tf.estimator.DNNRegressor(
    feature_columns=feature_columns,
    hidden_units=hidden_units,
)

4:調用訓練、評估或推理方法

  使用上述創建的模型進行train、evaluate、predict操作。首先需要定理訓練的輸入函數,將訓練集的特征和標簽都傳進去,然后開始訓練,例子如下:

training_input_fn = lambda:my_input_fn(train_df, train_target_df)
dnn_regressor.train(
    input_fn=training_input_fn,
    steps=300
)
 
        
 
        
 
        
 
        

參考:

Estimator 高級的API,介紹了創建estimator的流程

導入數據  介紹了數據集,還有迭代器的知識

Building Input Functions with tf.estimator  講解了如何定義輸入函數

特征列  詳細介紹了特征列,里面有9中特征列可以學習

google機器學習速成課程神經網絡簡介 ,完整的機器學習過程

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM