原文地址:這裏python
本部分咱們將繼續深刻而且嘗試構建多層全鏈接的神經網絡,而且自定義網絡模型並在此基礎上嘗試卷積網絡。git
固然,這裏並無太多關於其餘的線性/Logistic擬合的框架。TensorFlow一個基礎的理念就是但願可以將模型的不一樣的部分鏈接而且使用相關的代價函數去進行參數優化。Scikit Flow已經提供了很是便捷的封裝以供建立多層全鏈接單元,所以只須要簡單地將分類器替換爲TensorFlowDNNClassifier而後指定它的各個參數,就能夠進行相應的訓練與預測。網絡
>>> classifier = skflow.TensorFlowDNNClassifier( ... hidden_units=[10, 20, 10], ... n_classes=2, ... batch_size=128, ... steps=500, ... learning_rate=0.05) >>> classifier.fit(X_train, y_train) >>> score = accuracy_score(classifier.predict(X_test), y_test) >>> print("Accuracy: %f" % score) Accuracy: 0.67597765363
上述程序會用10,20以及10個獨立的隱藏單元建立一個3層的全鏈接網絡,而且使用默認的Rectified激活函數。關於這個激活函數的自定義將會在下面講到。框架
模型中的參數有一個示例,可是在實際的應用中,學習速率、優化器以及訓練步長的不一樣可能會致使結果有很大的差別性。通常狀況下,咱們會使用相似於超參數搜索的方法來尋找一個最優的組合。dom
筆者並無進行太多的參數搜索,可是以前的DNN模型確實拋出了一個比Logistic迴歸還要差的結果。可能這是由於過擬合或者欠擬合的情形。函數
爲了解決這個問題,筆者打算將上文中用的DNN模型轉化爲自定義的模型:學習
>>> def dnn_tanh(X, y): ... layers = skflow.ops.dnn(X, [10, 20, 10], tf.tanh) ... return skflow.ops.logistic_classifier(layers, y) >>> classifier = skflow.TensorFlowEstimator( ... model_fn=dnn_tanh, ... n_classes=2, ... batch_size=128, ... steps=500, ... learning_rate=0.05) >>> classifier.fit(X_train, y_train) >>> score = accuracy_score(classifier.predict(X_test), y_test) >>> print("Accuracy: %f" % score) Accuracy: 0.692737430168
這個模型很相似以前那個,可是咱們將激活方程從線性整流變成了雙曲正切。正如你所見,建立一個自定義的模型仍是很簡答的,就是輸入X與y這兩個Tensors,而後返回prediction與loss這兩個Tensor。測試
TensorFlow的教程當中天然應該包含一波數字識別的測試:優化
import random from sklearn import datasets, cross_validation, metrics import tensorflow as tf import skflow random.seed(42) # Load dataset and split it into train / test subsets. digits = datasets.load_digits() X = digits.images y = digits.target X_train, X_test, y_train, y_test = cross_validation.train_test_split(X, y, test_size=0.2, random_state=42) # TensorFlow model using Scikit Flow ops def conv_model(X, y): X = tf.expand_dims(X, 3) features = tf.reduce_max(skflow.ops.conv2d(X, 12, [3, 3]), [1, 2]) features = tf.reshape(features, [-1, 12]) return skflow.models.logistic_regression(features, y) # Create a classifier, train and predict. classifier = skflow.TensorFlowEstimator(model_fn=conv_model, n_classes=10, steps=500, learning_rate=0.05, batch_size=128) classifier.fit(X_train, y_train) score = metrics.accuracy_score(classifier.predict(X_test), y_test) print('Accuracy: %f' % score)
咱們自定義了con_model
函數,使用Tensor X以及y做爲參數,使用最大化池來建立一個二維的卷積層。這個層的結果做爲參數傳給了logistic擬合,在其中將會來處理具體的分類問題。咱們只須要按照自身的需求來添加不一樣的層便可以完成一些複雜的圖片識別或者其餘處理操做。code