【Python機器學習及實踐】進階篇:Tensorflow框架

Python機器學習及實踐——進階篇:Tensorflow框架

Tensorflow內部有自己所定義的常量、變量、數據操作等要素。Tensorflow使用圖(Graph)來表示計算任務;並使用會話(Session)來執行圖。


使用Tensorflow輸出一句話

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
@File  : TF01.py
@Author: Xinzhe.Pang
@Date  : 2019/7/26 22:00
@Desc  : 
"""
# 導入tensorflow工具包並命名爲tf
import tensorflow as tf
import numpy as np

# 初始化一個Tensorflow的常量:Open the door of Tensorflow! 字符串,並命名爲greeting作爲一個計算模塊
greeting = tf.constant('Open the door of Tensorflow!')

# 啓動一個繪畫
sess = tf.Session()

# 使用會話執行greeting計算模塊
result = sess.run(greeting)

# 輸出會話結果
print(result)
# 關閉會話
sess.close()

2019-07-26 22:03:13.411070: I tensorflow/core/platform/cpu_feature_guard.cc:141] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX
2019-07-26 22:03:13.444048: I tensorflow/core/common_runtime/process_util.cc:71] Creating new thread pool with default inter op setting: 4. Tune using inter_op_parallelism_threads for best performance.
b'Open the door of Tensorflow!'

出現了兩個警告信息,

解決方法:

  • 如果安裝的是GPU版本

如果你有一個GPU,你不應該關心AVX的支持,因爲大多數昂貴的操作將被分派到一個GPU設備上(除非明確地設置)。在這種情況下,您可以簡單地忽略此警告: 

import os 
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'

  • 如果安裝的是CPU版本(pip install tensorflow)

1.在代碼中加入如下代碼,忽略警告: 

import os 
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' 
2.編譯TensorFlow源碼 
如果您沒有GPU並且希望儘可能多地利用CPU,那麼如果您的CPU支持AVX,AVX2和FMA,則應該從針對CPU優化的源構建tensorflow。在這個問題中已經討論過這個問題,也是這個GitHub問題。 Tensorflow使用稱爲bazel的ad-hoc構建系統,構建它並不是那麼簡單,但肯定是可行的。在此之後,不僅警告消失,tensorflow性能也應該改善。


使用Tensorflow完成一次線性函數的計算

Tensorflow如何像搭積木一樣將各個不同的計算模塊拼接成流程圖,完成一次線性函數的計算,並在一個隱式會話中執行

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
@File  : TF02.py
@Author: Xinzhe.Pang
@Date  : 2019/7/26 22:21
@Desc  : 
"""
import tensorflow as tf
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'

# 聲明matrix1爲Tensorflow的一個1*2的行向量
matrix1 = tf.constant([[3., 3.]])
# 聲明matrix2爲Tensorflow的一個2*1的列向量
matrix2 = tf.constant([[2.], [2.]])
# product將上述兩個算子相乘,作爲新算例
product = tf.matmul(matrix1, matrix2)

# 繼續將product與一個標量2.0求和拼接,作爲最終的linear算例
linear = tf.add(product, tf.constant(2.0))

# 直接在會話中執行linear算例,相當於將上面所有的單獨算例拼接成流程圖來執行
with tf.Session() as sess:
    result = sess.run(linear)
    print(result)

[[ 14.]]


使用Tensorflow自定義一個線性分類器用於對“良/惡性乳腺癌腫瘤”進行預測

Tensorflow允許使用者自由選擇不同操作,並組織一個學習系統。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
@File  : TF03.py
@Author: Xinzhe.Pang
@Date  : 2019/7/26 22:30
@Desc  : 
"""
import tensorflow as tf
import numpy as np
import pandas as pd
import os

os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
# 使用sklearn.model_selection裏的train_test_split模塊用於分割數據
from sklearn.model_selection import train_test_split

# 使用pandas讀取乳腺腫瘤的訓練和測試數據
# 創建特徵列表
colnames = ['SampleNum', 'Clump Thickness', 'Cell Size', 'Cell Shape', 'Marginal Adhesion',
            'Single Epithelial Cell Size', 'Bare Nuclei', 'Bland Chromatin', 'Normal Nucleoli', 'Mitoses', 'Class']

# 使用pandas.read_csv函數從網絡上讀取指定數據
data = pd.read_csv(
    'https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin.data',
    names=colnames)
# 將?替換爲標準缺失值表示
data = data.replace(to_replace='?', value=np.nan)
# 丟棄帶有缺失值的數據(只要有一個維度有缺失)
data = data.dropna(how='any')

# 隨機採樣25%的數據用於測試,剩下的75%用於構建訓練集合
train, test = train_test_split(data, test_size=0.25, random_state=33)

X_train = np.float32(train[['Clump Thickness', 'Cell Size']].T)
y_train = np.float32(train['Class'].T)
X_test = np.float32(test[['Clump Thickness', 'Cell Size']].T)
y_test = np.float32(test['Class'].T)

# 定義一個tensorflow的變量b作爲線性模型的截距,同時設置初始值爲1.0
b = tf.Variable(tf.zeros([1]))
# 定義一個tensorflow的變量W作爲線性模型的係數,並設置初始值爲-1.0至1.0之間均勻分佈的隨機數
W = tf.Variable(tf.random_uniform([1, 2], -1.0, 1.0))

# 顯式地定義這個線性函數
y = tf.matmul(W, X_train) + b

# 使用tensorflow中的reduce_mean取得訓練集上均方誤差
loss = tf.reduce_mean(tf.square(y - y_train))

# 使用梯度下降法估計參數W,b,並且設置迭代步長爲0.01,這個與Scikit-learn中的SGDRegressor類似
optimizer = tf.train.GradientDescentOptimizer(0.01)
# 以最小二乘損失爲優化目標
train = optimizer.minimize(loss)

# 初始化所有變量
init = tf.global_variables_initializer()

# 開啓Tensorflow中的會話
sess = tf.Session()

# 執行變量初始化操作
sess.run(init)

# 迭代1000輪次,訓練參數
for step in range(0, 1000):
    sess.run(train)
    if step % 200 == 0:
        print(step, sess.run(W), sess.run(b))

# 準備測試樣本
test_negative = test.loc[test['Class'] == 2][['Clump Thickness', 'Cell Size']]
test_positive = test.loc[test['Class'] == 4][['Clump Thickness', 'Cell Size']]

# 以最終更新的參數作圖
import matplotlib.pyplot as plt

plt.scatter(test_negative['Clump Thickness'], test_negative['Cell Size'], marker='o', s=200, c='red')
plt.scatter(test_positive['Clump Thickness'], test_positive['Cell Size'], marker='x', s=150, c='black')

plt.xlabel('Clump Thickness')
plt.ylabel('Cell Size')

lx = np.arange(0, 12)

# 這裏強調,以0.5作爲分界面
ly = (0.5 - sess.run(b)) - lx * sess.run(W)[0][0] / sess.run(W)[0][1]

plt.plot(lx, ly, color='green')
plt.show()

WARNING:tensorflow:From D:\Anaconda3\lib\site-packages\tensorflow\python\framework\op_def_library.py:263: colocate_with (from tensorflow.python.framework.ops) is deprecated and will be removed in a future version.
Instructions for updating:
Colocations handled automatically by placer.

未解決

WARNING:tensorflow:From D:\Anaconda3\lib\site-packages\tensorflow\python\util\tf_should_use.py:193: initialize_all_variables (from tensorflow.python.ops.variables) is deprecated and will be removed after 2017-03-02.
Instructions for updating:
Use `tf.global_variables_initializer` instead.

將tf.initialize_all_variables換成 global_variables_initializer

skflow非常適合那些熟悉於scikit-learn編程接口對使用者,而且利用Tensorflow的運算架構和模塊,封裝了許多經典的機器學習模型,如線性迴歸器、深度全連接的神經網絡(DNN)等,推薦使用skflow;儘管如此,skflow仍然支持使用TensorFlow的基礎算子來自定義學習流程,比如在自己搭建神經網絡模型方面。

使用skflow內置的LinearRegreesor、DNN、以及scikit-learn中的集成迴歸模型對‘美國波士頓房價’進行迴歸預測

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
@File  : TF04.py
@Author: Xinzhe.Pang
@Date  : 2019/7/27 15:03
@Desc  : 
"""
from sklearn import datasets, metrics, preprocessing, model_selection

# 使用datasets.load_boston加載波士頓房價數據
boston = datasets.load_boston()

# 獲取房屋數據特徵以及對應房價
X, y = boston.data, boston.target
# 分割數據
X_train, X_test, y_train, y_test = model_selection.train_test_split(X, y, test_size=0.25, random_state=33)

# 對數據特徵進行標準化處理
scaler = preprocessing.StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

# 導入skflow
import skflow

# 使用skflow的LinearRegressor
tf_lr = skflow.TensorFlowLinearRegressor(steps=10000, learning_rate=0.01, batch_size=50)
tf_lr.fit(X_train, y_train)
tf_lr_y_pred = tf_lr.predict(X_test)

# 輸出skflow中LinearRegressor模型的迴歸性能
print('The MAE of Tensorflow Linear Regressor on boston dataset is ', metrics.mean_absolute_error(tf_lr_y_pred, y_test))
print('The MSE of Tensorflow Linear Regressor on boston dataset is ', metrics.mean_squared_error(tf_lr_y_pred, y_test))
print('The R-squared value of Tensorflow Linear Regressor on boston dataset is ',
      metrics.r2_score(tf_lr_y_pred, y_test))

# 使用skflow的DNNRegressor,並且注意其每個隱層特徵數量的配置
tf_dnn_regressor = skflow.TensorFlowDNNRegressor(hidden_units=[100, 40], steps=10000, learning_rate=0.01, batch_size=50)
tf_dnn_regressor.fit(X_train, y_train)
tf_dnn_regressor_y_pred = tf_dnn_regressor.predict(X_test)
# 輸出skflow中DNNRegressor模型的迴歸性能
print('The MAE of Tensorflow DNNRegressor on boston dataset is ',
      metrics.mean_absolute_error(tf_dnn_regressor_y_pred, y_test))
print('The MSE of Tensorflow DNNRegressor on boston dataset is ',
      metrics.mean_squared_error(tf_dnn_regressor_y_pred, y_test))
print('The R-squared value of Tensorflow DNNRegressor on boston dataset is ',
      metrics.r2_score(tf_dnn_regressor_y_pred, y_test))

# 使用Scikit-learn的RandomForestRegressor
from sklearn.ensemble import RandomForestRegressor

rfr = RandomForestRegressor()
rfr.fit(X_train, y_train)
rfr_y_pred = rfr.predict(X_test)

# 輸出Scikit-learn的RandomForestRegressor模型的迴歸性能
print('The MAE of Sklearn RandomForestRegressor on boston dataset is ',
      metrics.mean_absolute_error(rfr_y_pred, y_test))
print('The MSE of Sklearn RandomForestRegressor on boston dataset is ',
      metrics.mean_squared_error(rfr_y_pred, y_test))
print('The R-squared value of Sklearn RandomForestRegressor on boston dataset is ',
      metrics.r2_score(rfr_y_pred, y_test))

通過上述一系列的輸出可知,深度神經網絡可以表現處更高的性能,不過需注意的是,越是具備描述複雜數據的強力模型, #越容易在訓練時陷入過擬合,這一點需要在配置DNN的層數和每層特徵元的數量時特別注意。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章