機器學習tensorflow框架初試
本文來自網易雲社群
作者:汪洋
前言
新手學習可以點選參考Google的教程。開始前,我們先在本地安裝好 TensorFlow機器學習框架。
首先我們在本地window下安裝好python環境,約定安裝3.6版本;
安裝Anaconda工具集後,建立名為 tensorflow 的conda 環境:conda create -n tensorflow pip python=3.6;
conda切換環境:activate tensorflow;
我們安裝支援CPU的TensorFlow版本(快速):pip install --ignore-installed --upgrade tensorflow;
最後驗證安裝是否成功,進入 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 |
說明:
最後一列代表著鳶尾花的品種,也就是說它是監督學習中的標籤;
中間四列從左到右表示花萼的長度和寬度、花瓣的長度和寬度;
表格資料代表了從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+款雲產品
更多網易研發、產品、運營經驗分享請訪問網易雲社群。