Tensorflow是一個(gè)完整的編碼框架。就如同我們按照python編程語法設(shè)計(jì)程序一樣。Tensorflow內(nèi)部也有自己所定義的常量、變量、數(shù)據(jù)操作等要素。不同的是,Tensorflow使用圖來表示計(jì)算任務(wù);并使用會(huì)話來執(zhí)行圖。
使用Tensorflow輸出一句話
import tensorflow as tf
import numpy as np
#初始化一個(gè)Tensorflow的常量:Hello Google Tensorflow!字符串,并命名為greeting作為一個(gè)計(jì)算模塊。
greeting=tf.constant('Hello Google Tensorflow!')
#啟動(dòng)一個(gè)會(huì)話
sess=tf.Session()
#使用會(huì)話執(zhí)行g(shù)reeting計(jì)算模塊
result=sess.run(greeting)
#輸出會(huì)話執(zhí)行的結(jié)果
print(result)
#關(guān)閉會(huì)話。這是一種顯式關(guān)閉會(huì)話的方式
sess.close()
b'Hello Google Tensorflow!'
使用Tensorflow完成一次線性函數(shù)的計(jì)算
#聲明matrix1為Tensorflow的一個(gè)1*2的行向量
matrix1=tf.constant([[3.,3.]])
#聲明matrix2為Tensorflow的一個(gè)2*1的列向量
matrix2=tf.constant([[2.],[2.]])
#product將上述兩個(gè)算子相乘,作為新算例
product=tf.matmul(matrix1,matrix2)
#繼續(xù)將product與一個(gè)標(biāo)量2.0求和拼接,作為最終的linear算例
linear=tf.add(product,tf.constant(2.0))
#直接在會(huì)話中執(zhí)行l(wèi)inear算例,相當(dāng)于將上面所有單獨(dú)算例拼接成流程圖來執(zhí)行
with tf.Session() as sess:
result=sess.run(linear)
print(result)
[[ 14.]]
雖然上述代碼可以說明Tensorflow是一個(gè)變成框架,但是截至目前還沒有顯示出其機(jī)器學(xué)習(xí)的能力。那么接下來的代碼將要向各位讀者展示如何利用Tensorflow自行搭建一個(gè)線性分類器。與直接使用Scikit-learn中已經(jīng)編寫好的LogiticRegression模型不同,Tensorflow允許使用者自由選取不同操作,并組織一個(gè)學(xué)習(xí)系統(tǒng)。這里我們對(duì)所要使用的線性分類器做一個(gè)簡化:取0.5(良性腫瘤為0,惡性腫瘤為1)為界,并采用最小二乘法擬合模型參數(shù)。
使用Tensorflow自定義一個(gè)線性分類器用于“良/惡性乳腺癌腫瘤”進(jìn)行預(yù)測(cè)
import tensorflow as tf
import numpy as np
import pandas as pd
train=pd.read_csv('/Users/daqi/Documents/Python機(jī)器學(xué)習(xí)及實(shí)踐/Datasets/Breast-Cancer/breast-cancer-train.csv')
test=pd.read_csv('/Users/daqi/Documents/Python機(jī)器學(xué)習(xí)及實(shí)踐/Datasets/Breast-Cancer/breast-cancer-test.csv')
#分隔特征與分類目標(biāo)
X_train=np.float32(train[['Clump Thickness','Cell Size']].T)
y_train=np.float32(train['Type'].T)
X_test=np.float32(train[['Clump Thickness','Cell Size']].T)
y_test=np.float32(train['Type'].T)
#定義一個(gè)tensorflow的變量b作為線性模型的截距,同時(shí)設(shè)置初始值為1.0。
b=tf.Variable(tf.zeros([1]))
#定義一個(gè)tensorflow的變量W作為線性模型的系數(shù),并設(shè)置初始值為-1.0至1.0之間均勻分布的隨機(jī)數(shù)。
W=tf.Variable(tf.random_uniform([1,2],-1.0,1.0))
#顯式定義這個(gè)線性函數(shù)
y=tf.matmul(W,X_train)+b
#使用tensorflow中的reduce_mean取得訓(xùn)練集上均方誤差
loss=tf.reduce_mean(tf.square(y-y_train))
#使用梯度下降法估計(jì)參數(shù)W,b,并且設(shè)置迭代步長為0.01,這個(gè)與scikit-learn中的SGDRegressor類似
optimizer=tf.train.GradientDescentOptimizer(0.01)
#以最小二乘損失為優(yōu)化目標(biāo)
train=optimizer.minimize(loss)
#初始化所有變量
init=tf.initialize_all_variables()
#開啟Tensorflow中的會(huì)話
sess=tf.Session()
#執(zhí)行變量初始化操作
sess.run(init)
#迭代1000輪次,訓(xùn)練參數(shù)
for step in range(0,1000):
sess.run(train)
if step %200==0:
print(step,sess.run(W),sess.run(b))
0 [[-0.23830706 0.59195495]] [-0.0683303]
200 [[ 0.03732548 0.09953798]] [-0.09818262]
400 [[ 0.05677485 0.07890751]] [-0.08934592]
600 [[ 0.05779386 0.07756446]] [-0.087328]
800 [[ 0.05785419 0.07744326]] [-0.08696128]
#準(zhǔn)備測(cè)試樣本
test_negative=test.loc[test['Type']==0][['Clump Thickness','Cell Size']]
test_positive=test.loc[test['Type']==1][['Clump Thickness','Cell Size']]
#以最終更新的參數(shù)
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)
#這里強(qiáng)調(diào)下,我們以0.5作為分界面,所以計(jì)算方式如下
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()

skflow非常適合于熟悉Scikit-learn編程接口(API)的使用者,而且利用Tensorflow的運(yùn)算架構(gòu)和模塊封裝了許多經(jīng)典的機(jī)器學(xué)習(xí)模型,如線性回歸器、深度全連接的神經(jīng)網(wǎng)絡(luò)(DNN)等。
使用skflow內(nèi)置的LogiticRegression、DNN、Scikit-learn中的集成回歸模型對(duì)“美國波士頓房價(jià)”數(shù)據(jù)進(jìn)行回歸預(yù)測(cè)
from sklearn import datasets,metrics,preprocessing,cross_validation
boston=datasets.load_boston()
#獲取房屋數(shù)據(jù)特征以及對(duì)應(yīng)房價(jià)
X,y=boston.data,boston.target
#分割數(shù)據(jù),隨機(jī)采樣25%作為測(cè)試樣本
X_train,X_test,y_train,y_test=cross_validation.train_test_split(X,y,test_size=0.25,random_state=33)
#對(duì)數(shù)據(jù)特征進(jìn)行標(biāo)準(zhǔn)化處理。
scaler=preprocessing.StandardScaler()
X_train=scaler.fit_transform(X_train)
X_test=scaler.transform(X_test)
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_predict=tf_lr.predict(X_test)
#輸出skflow中的LinearRegressor模型的回歸性能。
print('The mean absolute error of Tensorflow Linear Regressor on boston dataset is',metrics.mean_absolute_error(tf_lr_y_predict,y_test))
print('The mean squared error of Tensorflow Linear Regressor on boston dataset is',metrics.mean_squared_error(tf_lr_y_predict,y_test))
print('The mean R-squared error of Tensorflow Linear Regressor on boston dataset is',metrics.r2_score(tf_lr_y_predict,y_test))
The mean absolute error of Tensorflow Linear Regressor on boston dataset is 20.6774992764
The mean squared error of Tensorflow Linear Regressor on boston dataset is 458.29343764
The mean R-squared error of Tensorflow Linear Regressor on boston dataset is -11.3519662471
#使用skflow的DNNRegressor,并且注意其每個(gè)隱層特征數(shù)量的配置。
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_predict=tf_dnn_regressor.predict(X_test)
#輸出skflow中的DNNRegressor模型的回歸性能。
print('The mean absolute error of Tensorflow DNN Regressor on boston dataset is',metrics.mean_absolute_error(tf_dnn_regressor_y_predict,y_test))
print('The mean squared error of Tensorflow DNN Regressor on boston dataset is',metrics.mean_squared_error(tf_dnn_regressor_y_predict,y_test))
print('The mean R-squared error of Tensorflow DNN Regressor on boston dataset is',metrics.r2_score(tf_dnn_regressor_y_predict,y_test))
The mean absolute error of Tensorflow DNN Regressor on boston dataset is 2.4622086127
The mean squared error of Tensorflow DNN Regressor on boston dataset is 18.2267462678
The mean R-squared error of Tensorflow DNN Regressor on boston dataset is 0.750988158261
from sklearn.ensemble import RandomForestRegressor
rfr=RandomForestRegressor()
rfr.fit(X_train,y_train)
rfr_y_predict=rfr.predict(X_test)
#輸出skflow中的DNNRegressor模型的回歸性能。
print('The mean absolute error of Tensorflow Random Forest Regressor on boston dataset is',metrics.mean_absolute_error(rfr_y_predict,y_test))
print('The mean squared error of Tensorflow Random Forest Regressor on boston dataset is',metrics.mean_squared_error(rfr_y_predict,y_test))
print('The mean R-squared error of Tensorflow Random Forest Regressor on boston dataset is',metrics.r2_score(rfr_y_predict,y_test))
The mean absolute error of Tensorflow Random Forest Regressor on boston dataset is 2.47141732283
The mean squared error of Tensorflow Random Forest Regressor on boston dataset is 15.2839866142
The mean R-squared error of Tensorflow Random Forest Regressor on boston dataset is 0.786460063124
通過輸出結(jié)果,可以對(duì)比發(fā)現(xiàn)深度神經(jīng)網(wǎng)絡(luò)的確可以表現(xiàn)出更高的性能。但是,越是具備描述復(fù)雜數(shù)據(jù)的強(qiáng)力模型,越容易在訓(xùn)練時(shí)陷入過擬合。這一點(diǎn),請(qǐng)讀者在配置DNN的層數(shù)和每層特征元的數(shù)量時(shí)要特別注意。