1. 程式人生 > >機器學習tensorflow框架初試

機器學習tensorflow框架初試

本文來自網易雲社群

作者:汪洋

前言

新手學習可以點選參考Google的教程。開始前,我們先在本地安裝好 TensorFlow機器學習框架。 

  1. 首先我們在本地window下安裝好python環境,約定安裝3.6版本;

  2. 安裝Anaconda工具集後,建立名為 tensorflow 的conda 環境:conda create -n tensorflow pip python=3.6;

  3. conda切換環境:activate tensorflow;

  4. 我們安裝支援CPU的TensorFlow版本(快速):pip install --ignore-installed --upgrade tensorflow;

  5. 最後驗證安裝是否成功,進入 python dos命名,輸入以下程式碼校驗:

    import tensorflow as tf
    hello = tf.constant('Hello, TensorFlow')
    sess = tf.Session()
    print(sess.run(hello))

    輸出Hello, TensorFlow,表示成功了。如果失敗的話,就選擇低版本重新安裝如:pip install --ignore-installed --upgrade tensorflow==1.5.0。
    其它安裝方式點選參考教程

監督學習實踐

官方針對新手演示了一個入門示例,點選教程可檢視,本文就圍繞這個教程分享。

1.分類

官方示例裡講解了分類鳶尾花問題的解決,我們想到的就是用監督學習訓練機器模型。採用這種學習方式後,我們需要確定用鳶尾花的哪些特徵來分類,鳶尾花的特徵還是蠻多的,官方示例裡用的是花萼和花瓣的長度和寬度。
鳶尾花種類非常多,官方也僅是針對三種進行分類:

expected = ['Setosa', 'Versicolor', 'Virginica']

接下來就是獲取大量資料,進行預處理,官方示例裡直接引用了他人整理的資料來源,省略了前期資料處理步驟,前5條資料結構如下:

SepalLengthSepalWidthPetalLengthPetalWidthSpecies
06.42.85.62.22
15.02.33.31.01
24.92.54.51.72
34.93.11.50.10
45.73.81.70.10

說明:

  1. 最後一列代表著鳶尾花的品種,也就是說它是監督學習中的標籤;

  2. 中間四列從左到右表示花萼的長度和寬度、花瓣的長度和寬度;

  3. 表格資料代表了從120個樣本的資料集中抽集的5個樣本;
    機器學習一般依賴數值,因此當前資料集中標籤值都為數字,對應關係: 

012
SetosaVersicolorVirginica

接下來將編寫程式碼,先複習下概念,模型指特徵和標籤之間的關係;訓練指機器學習階段,這個階段模型不斷優化。示例裡選擇的監督試學習方式,模型通過包含標籤的樣本進行訓練。

2. 匯入和解析資料集 

首先我們要獲取訓練集和測試集,其中訓練集是訓練模型的樣本,測試集是評估訓練後模型效果的樣本。
首先設定我們選擇的資料集地址

 """訓練集"""TRAN_URL = "http://download.tensorflow.org/data/iris_training.csv""""測試集"""TEST_URL = "http://download.tensorflow.org/data/iris_test.csv"

使用tensorflow.keras.utils.get_file函式下載資料集,該方法第一個引數為檔名稱,第二個引數為下載地址,點選檢視詳細)。

import tensorflow as tfdef download():
    train_path = tf.keras.utils.get_file('iris_training.csv', TRAN_URL)
    test_path = tf.keras.utils.get_file('iris_test.csv', TEST_URL)    return train_path, test_path

然後用pandas.read_csv函式解析下載的資料,解析後生成的格式是一個表格,然後再分成特徵列表和標籤列表,返回訓練集和測試集

import pandas as pd
CSV_COLUMN_NAMES = ['SepalLength', 'SepalWidth',                    'PetalLength', 'PetalWidth', 'Species']def load_data(y_species='Species'):
    train_path, test_path = download()
    train = pd.read_csv(train_path, names=CSV_COLUMN_NAMES, header=0)
    train_x, train_y = train, train.pop(y_species)

    test = pd.read_csv(test_path, names=CSV_COLUMN_NAMES, header=0)
    test_x, test_y = test, test.pop(y_species)    return (train_x, train_y), (test_x, test_y)

3. 特徵列-數值列 

我們已經獲取到資料集,在tensorflow中需要將資料轉換為模型(Estimator)可以使用的資料結構,這時候呼叫tf.feature_column模組中的函式來轉換。鳶尾花例子中,需將特徵資料轉換為浮點數,呼叫tf.feature_column.numeric_column方法。

import iris_data

(train_x, train_y), (test_x, test_y) = iris_data.load_data()
my_feature_columns = []for key in train_x.keys():
    my_feature_columns.append(tf.feature_column.numeric_column(key=key))

其中key是 ['SepalLength' , 'SepalWidth' , 'PetalLength' , 'PetalWidth'] 其中之一。

4. 模型選擇 

官方例子中選擇全連線神經網路解決鳶尾花問題,用神經網路來發現特徵與標籤之間的複雜關係。tensorflow中,通過例項化一個Estimator類指定模型型別,這裡我們使用官方提供的預建立的Estimator類,tf.estimator.DNNClassifier,此Estimator會構建一個對樣本進行分類的神經網路。

classifier = tf.estimator.DNNClassifier(
    feature_columns = my_feature_columns,
    hidden_units = [10,10],
    n_classes = 3)

feature_columns 引數指訓練的特徵列(這裡是數值列);
hidden_units 引數定義神經網路內每個隱藏層中的神經元數量,這裡設定了2個隱藏層,每個隱藏層中神經元數量都是10個;
n_classes 引數表示要預測的標籤數量,這裡我們需要預測3個品種;
其它引數點選檢視

5. 訓練模型 

上一步我們已經建立了一個學習模型,接下來將資料匯入到模型中進行訓練。tensorflow中,呼叫Estimator物件的train方法訓練。

classifier.train(
    input_fn = lambda:iris_data.train_input_fn(train_x, train_y, 100)
    steps = 1000)

input_fn 引數表示提供訓練資料的函式; steps 引數表示訓練迭代次數;
在train_input_fn函式裡,我們將資料轉換為 train方法所需的格式。 

dataset = tf.data.Dataset.from_tensor_slices((dict(features), labels))

為了保證訓練效果,訓練樣本需隨機排序。buffer_size 設定大於樣本數(120),可確保資料得到充分的隨機化處理。 

dataset = dataset.shuffle(1000)

為了保證訓練期間,有無限量的訓練樣本,需呼叫 tf.data.Dataset.repeat。

dataset = dataset.repeat()

train方法一次處理一批樣本, tf.data.Dataset.batch 方法通過組合多個樣本建立一個批次,這裡組合多個包含100個樣本的批次。

dataset = dataset.batch(100)

6. 模型評估 

接下來我們將訓練好的模型預測效果。tensorflow中,每個Estimator物件提供了evaluate方法。

eval_result = classifier.evaluate(
    input_fn = lambda:iris_data.eval_input_fn(test_x, test_y, 100)
)

在eval_input_fn函式裡,我們將資料轉換為 evaluate方法所需的格式。實現跟訓練一樣,只是無需隨機化處理和無限量重複使用測試集。

dataset = tf.data.Dataset.from_tensor_slices((dict(features), labels))
dataset.batch(100);return dataset

7. 預測 

接下來將該模型對無標籤樣本進行預測。官方手動提供了三個無標籤樣本。

predict_x = {    'SepalLength': [5.1, 5.9, 6.9],    'SepalWidth': [3.3, 3.0, 3.1],    'PetalLength': [1.7, 4.2, 5.4],    'PetalWidth': [0.5, 1.5, 2.1],
}

tensorflow中,每個Estimator物件提供了predict方法。

predictions = classifier.predict(
    input_fn = lambda:iris_data.eval_input_fn(predict_x, labels=None, 100)
)

改造下eval_input_fn方法,使其能夠接受 labels = none 情況

features=dict(features)if labels is None:
    inputs = featureselse:
    inputs = (features, labels)
dataset = tf.data.Dataset.from_tensor_slices(inputs)

接下來列印下預測結果, predictions 中 class_ids表示可能性最大的品種,probabilities 表示每個品種的概率

for pred_dict in predictions:
    class_id = pred_dict['class_ids'][0]
    probability = pred_dict['probabilities'][class_id]
    print(class_id, probability)

結果如下:

00.99706334
10.997407
20.97377485

結尾

通過官方例子,新手可初步瞭解其使用,當然更深入的使用還得學習理論和多使用API。本文是根據官方例子,作為新手重新梳理了一遍。

網易雲免費體驗館,0成本體驗20+款雲產品

更多網易研發、產品、運營經驗分享請訪問網易雲社群