3.2.4Tensorflow框架

作者: idatadesign | 来源:发表于2017-12-05 21:37 被阅读44次

    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的层数和每层特征元的数量时要特别注意。

    相关文章

      网友评论

        本文标题:3.2.4Tensorflow框架

        本文链接:https://www.haomeiwen.com/subject/oddfixtx.html