中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Tensorflow 利用tf.contrib.learn建立輸入函數的方法

發布時間:2020-08-21 14:55:00 來源:腳本之家 閱讀:171 作者:王小草--點絳唇 欄目:開發技術

在實際的業務中,可能會遇到很大量的特征,這些特征良莠不齊,層次不一,可能有缺失,可能有噪聲,可能規模不一致,可能類型不一樣,等等問題都需要我們在建模之前,先預處理特征或者叫清洗特征。那么這清洗特征的過程可能涉及多個步驟可能比較復雜,為了代碼的簡潔,我們可以將所有的預處理過程封裝成一個函數,然后直接往模型中傳入這個函數就可以啦~~~

接下來我們看看究竟如何做呢?

1. 如何使用input_fn自定義輸入管道

當使用tf.contrib.learn來訓練一個神經網絡時,可以將特征,標簽數據直接輸入到.fit(),.evaluate(),.predict()操作中。比如在筆記04中就使用到了,復看一下代碼:

# 將特征與標簽數據載入
training_set = tf.contrib.learn.datasets.base.load_csv_with_header(
 filename=IRIS_TRAINING, target_dtype=np.int, features_dtype=np.float32)

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


# 然后將兩個數據喂給.fit()函數去訓練
classifier.fit(x=training_set.data,
    y=training_set.target,
    steps=2000)

當原始數據不需要或幾乎很少需要一些額外的預處理時,使用以上的方式到也不為過。然而在實際的業務中我們往往需要去做大量的特征工程,于是tf.contrib.learn支持使用一個用戶自定義的輸入函數input_fn來封裝數據預處理的邏輯,并且將數據通過管道輸送到模型中。

1.1 解剖input_fn函數的結構

以下是一個input_fn函數的基本結構:

def my_input_fn():

 # Preprocess your data here...(首先預處理你的數據)

 # ...then return 1) a mapping of feature columns to Tensors with
 # the corresponding feature data, and 2) a Tensor containing labels
 # 然后返回新的特征數據與標簽數據(都是以tensor的形式)
 return feature_cols, labels

輸入函數的主體包括一個特定的預處理輸入數據的邏輯,比如去除一些臟數據,彌補缺失數據,歸一化等等。

輸入函數的返回是兩個部分:

(1)處理后的特征:feature_cols,格式是一個map,key是特征的名稱,value是tensor形式的對應的特征列數據
(2)標簽數據:labels,一個包含標簽數據的tensor

1.2 如何將特征數據轉換成tensors形式

如果你的特征/標簽是存儲在pandas的dataframe中或者numpy的array中的話,你就需要在返回特征與標簽的時候將它們轉換成tensor形式哦~那么怎么轉換呢,來看一個小例子。

對于連續型數據,你可以使用tf.constant創建一個tensor:

feature_column_data = [1, 2.4, 0, 9.9, 3, 120]
feature_tensor = tf.constant(feature_column_data)

對于稀疏型數據,類別下數據,你可以使用tf.SparseTensor來創建tensor:

sparse_tensor = tf.SparseTensor(indices=[[0,1], [2,4]],
        values=[6, 0.5],
        dense_shape=[3, 5])

可見,tf.SparseTensor有3個參數,分別是:

(1)dense_shape

這是tensor的shape,比如dense_shape=[3,6],表示tensor有3*6共2個維度;dense_shape=[2,3,4]表示tensor有2*3*4共3個維度;dense_shape=[9]表示tensor有1個維度,這個維度里有9個元素。

(2)indices

表示在這個tensor中indices索引所在的位置是非0值,其余都是0值。比如[0,0]表示在第1行第1列的值非0.

(3)values

value是一個1維的tensor, 其元素與indices中的索引一一對應,比如indices=[[1,3], [2,4]],values=[18, 3.6],表示在行索引為1列索引為3的位置值為18,在行索引為2列索引為4的位置值為3.6

因此上面的代碼意思一目了然了,創建一個稀疏tensor,大小是3*5,在行索引為0列索引為1的位置值為6,在行索引為2,列索引為4的位置值為0.5,其余位置值為0.

打印出來應是:

[[0, 6, 0, 0, 0]
 [0, 0, 0, 0, 0]
 [0, 0, 0, 0, 0.5]]

1.3 如何將input_fn數據傳給模型

在輸入函數input_fn中封裝好了特征預處理的邏輯,并且也返回了新的特征與標簽。那怎么把這個輸入函數或者說新的特征與標簽傳入模型中呢?

在.fit()操作中有一個參數:input_fn,只要將我們定義好的輸入函數傳給這個參數即可:

classifier.fit(input_fn=my_input_fn, steps=2000)

但是,極其注意的是絕不能直接這樣做:

classifier.fit(input_fn=my_input_fn(training_set), steps=2000)

如果你想直接傳參數給輸入函數,可以選擇令愛幾個方法:

(1)再寫一個封裝函數如下:

def my_input_function_training_set():
 return my_input_function(training_set)

classifier.fit(input_fn=my_input_fn_training_set, steps=2000)

(2)使用Python's functools.partial方法:

classifier.fit(input_fn=functools.partial(my_input_function,
           data_set=training_set), steps=2000)

(3)在lambda中調用輸入函數,然后將參數傳入input_fn中

classifier.fit(input_fn=lambda: my_input_fn(training_set), steps=2000)

個人建議使用第三種方法。

2.案例實戰

2.1 數據介紹

數據集下載地址:https://archive.ics.uci.edu/ml/datasets/Housing

這是一份預測房價的數據,我們用它去訓練一個神經網絡去預測房價,總共選取9個特征,數據的特征如下:

Tensorflow 利用tf.contrib.learn建立輸入函數的方法

要預測的標簽數據是MEDV,是業主自用住宅的價格均值。

在開始建模之前,我們先去下載好 boston_train.csv(訓練集), boston_test.csv(測試集), and boston_predict.csv(預測集)這份文件

2.2 加載數據

首先導入需要的庫(包括pandas, tensorflow),并且設置logging verbosity為INFO,這樣就可以獲取到更多的日志信息了。

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

import itertools

import pandas as pd
import tensorflow as tf

tf.logging.set_verbosity(tf.logging.INFO)

定義一個變量COLUMNS,將所有的特征名稱與類別標簽名稱存儲成list并賦值給他。

為了區分特征名稱與標簽名稱,同時也將它們分別春初一個變量

COLUMNS = ["crim", "zn", "indus", "nox", "rm", "age",
   "dis", "tax", "ptratio", "medv"]
FEATURES = ["crim", "zn", "indus", "nox", "rm",
   "age", "dis", "tax", "ptratio"]
LABEL = "medv"

然后,將三份數據文件都用pandas.read_csv載入:

第一個參數是數據文件的路徑,第二個參數是是否需要取出前后空值,第三個參數是去除的行數,第四個參數是列名

training_set = pd.read_csv("boston_train.csv", skipinitialspace=True,
       skiprows=1, names=COLUMNS)

test_set = pd.read_csv("boston_test.csv", skipinitialspace=True,
      skiprows=1, names=COLUMNS)

prediction_set = pd.read_csv("boston_predict.csv", skipinitialspace=True,
        skiprows=1, names=COLUMNS)

2.3 定義特征列并且創建回歸模型

現在創建一組FeatureColumn作為輸入數據,正式指定哪些特征需要被用來訓練。在我們的房價預測特征中所有數據都是連續型的值,因此你可以直接使用tf.contrib.layers.real_valued_column()來創建FeatureColumn

feature_cols = [tf.contrib.layers.real_valued_column(k)
     for k in FEATURES]

接著我們來調用DNNRegressor函數實例化一個神經網絡回歸模型。

這里需要提供3個參數:

  1. feature_columns:一組剛剛定義的特征列
  2. hidden_units:每層隱藏層的神經網絡個數
  3. model_dir:模型保存的路徑
regressor = tf.contrib.learn.DNNRegressor(feature_columns=feature_cols,
           hidden_units=[10, 10],
           model_dir="/tmp/boston_model")

2.4 構建輸入函數input_fn

這里我們構建一個輸入函數去預處理數據,處理的內容比較簡單,只是將用pandas讀進來的dataframe形式的數據轉換成tensor.

def input_fn(data_set):
 feature_cols = {k: tf.constant(data_set[k].values)
     for k in FEATURES}
 labels = tf.constant(data_set[LABEL].values)
 return feature_cols, labels

2.5 訓練模型

訓練模型,我們調用fit()函數,并且將訓練數據集training_set作為參數傳入

regressor.fit(input_fn=lambda: input_fn(training_set), steps=5000)

運行代碼,你會看到有如下日志打印:

INFO:tensorflow:Step 1: loss = 483.179
INFO:tensorflow:Step 101: loss = 81.2072
INFO:tensorflow:Step 201: loss = 72.4354
...
INFO:tensorflow:Step 1801: loss = 33.4454
INFO:tensorflow:Step 1901: loss = 32.3397
INFO:tensorflow:Step 2001: loss = 32.0053
INFO:tensorflow:Step 4801: loss = 27.2791
INFO:tensorflow:Step 4901: loss = 27.2251
INFO:tensorflow:Saving checkpoints for 5000 into /tmp/boston_model/model.ckpt.
INFO:tensorflow:Loss for final step: 27.1674.

2.6 評估模型

模型訓練好,就到了評估的時刻了,還是用測試數據集test_set來評估

ev = regressor.evaluate(input_fn=lambda: input_fn(test_set), steps=1)

提取損失并打印:

loss_score = ev["loss"]
print("Loss: {0:f}".format(loss_score))

打印結果應如下:

INFO:tensorflow:Eval steps [0,1) for training step 5000.
INFO:tensorflow:Saving evaluation summary for 5000 step: loss = 11.9221
Loss: 11.922098

2.7 使用模型做預測

模型要是評估通過,就可以用來預測新的數據了呢,這里我們使用prediction_set這個數據集,數據中只包含了特征沒有標簽,需要我們去預測。

y = regressor.predict(input_fn=lambda: input_fn(prediction_set))

# .predict() returns an iterator; convert to a list and print predictions

predictions = list(itertools.islice(y, 6))
print ("Predictions: {}".format(str(predictions)))

打印結果如下:

Predictions: [ 33.30348587  17.04452896  22.56370163  34.74345398  14.55953979
  19.58005714]

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

惠水县| 桑日县| 炉霍县| 洛南县| 乌兰浩特市| 阳朔县| 天等县| 乌兰察布市| 高阳县| 江陵县| 河南省| 四子王旗| 金秀| 寿宁县| 盐亭县| 涿鹿县| 安庆市| 普定县| 禄丰县| 枣强县| 巢湖市| 石城县| 永定县| 陆川县| 宜阳县| 江孜县| 嵩明县| 广安市| 当阳市| 宁武县| 伊宁市| 揭阳市| 绥芬河市| 浠水县| 江津市| 甘孜县| 望城县| 玉山县| 琼海市| 营山县| 北海市|