TensorFlow实战之Scikit Flow系列指导:Part 2

原文地址:这里python

本部分咱们将继续深刻而且尝试构建多层全链接的神经网络,而且自定义网络模型并在此基础上尝试卷积网络。git

Multi-layer fully connected neural network

固然,这里并无太多关于其余的线性/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

Multi-layer with tanh activation

笔者并无进行太多的参数搜索,可是以前的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。测试

Digit recognition

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

相关文章
相关标签/搜索