3.2.4Tensorflow框架

Tensorflow是一个完整的编码框架。就如同我们按照python编程语法设计程序一样。Tensorflow内部也有自己所定义的常量、变量、数据操作等要素。不同的是,Tensorflow使用来表示计算任务;并使用会话来执行图。

使用Tensorflow输出一句话
import tensorflow as tf
import numpy as np

#初始化一个Tensorflow的常量:Hello Google Tensorflow!字符串,并命名为greeting作为一个计算模块。
greeting=tf.constant('Hello Google Tensorflow!')

#启动一个会话
sess=tf.Session()
#使用会话执行greeting计算模块
result=sess.run(greeting)
#输出会话执行的结果
print(result)
#关闭会话。这是一种显式关闭会话的方式
sess.close()

b'Hello Google Tensorflow!'

使用Tensorflow完成一次线性函数的计算
#声明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自行搭建一个线性分类器。与直接使用Scikit-learn中已经编写好的LogiticRegression模型不同,Tensorflow允许使用者自由选取不同操作,并组织一个学习系统。这里我们对所要使用的线性分类器做一个简化:取0.5(良性肿瘤为0,恶性肿瘤为1)为界,并采用最小二乘法拟合模型参数。

使用Tensorflow自定义一个线性分类器用于“良/恶性乳腺癌肿瘤”进行预测
import tensorflow as tf
import numpy as np
import pandas as pd

train=pd.read_csv('/Users/daqi/Documents/Python机器学习及实践/Datasets/Breast-Cancer/breast-cancer-train.csv')
test=pd.read_csv('/Users/daqi/Documents/Python机器学习及实践/Datasets/Breast-Cancer/breast-cancer-test.csv')

#分隔特征与分类目标
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)

#定义一个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.initialize_all_variables()

#开启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))

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]

#准备测试样本
test_negative=test.loc[test['Type']==0][['Clump Thickness','Cell Size']]
test_positive=test.loc[test['Type']==1][['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()

skflow非常适合于熟悉Scikit-learn编程接口(API)的使用者,而且利用Tensorflow的运算架构和模块封装了许多经典的机器学习模型,如线性回归器、深度全连接的神经网络(DNN)等。

使用skflow内置的LogiticRegression、DNN、Scikit-learn中的集成回归模型对“美国波士顿房价”数据进行回归预测
from sklearn import datasets,metrics,preprocessing,cross_validation

boston=datasets.load_boston()

#获取房屋数据特征以及对应房价
X,y=boston.data,boston.target

#分割数据,随机采样25%作为测试样本
X_train,X_test,y_train,y_test=cross_validation.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)

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,并且注意其每个隐层特征数量的配置。
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

通过输出结果,可以对比发现深度神经网络的确可以表现出更高的性能。但是,越是具备描述复杂数据的强力模型,越容易在训练时陷入过拟合。这一点,请读者在配置DNN的层数和每层特征元的数量时要特别注意。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容