機器學習tensorflow框架初試

本文來自網易雲社區html

做者:汪洋python


前言

新手學習能夠點擊參考Google的教程。開始前,咱們先在本地安裝好 TensorFlow機器學習框架。 windows

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

  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;app

  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條數據結構以下:


SepalLength SepalWidth PetalLength PetalWidth Species
0 6.4 2.8 5.6 2.2 2
1 5.0 2.3 3.3 1.0 1
2 4.9 2.5 4.5 1.7 2
3 4.9 3.1 1.5 0.1 0
4 5.7 3.8 1.7 0.1 0

說明:

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

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

  3. 表格數據表明了從120個樣本的數據集中抽集的5個樣本;
    機器學習通常依賴數值,所以當前數據集中標籤值都爲數字,對應關係: 

0 1 2
Setosa Versicolor Virginica

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

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)

結果以下:



0 0.99706334
1 0.997407
2 0.97377485


結尾

經過官方例子,新手可初步瞭解其使用,固然更深刻的使用還得學習理論和多使用API。本文是根據官方例子,做爲新手從新梳理了一遍。



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

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

 


相關文章:
【推薦】 雲計算交互設計師的正確出裝姿式

相關文章
相關標籤/搜索