原文地址:这里
本部分我们将继续深入并且尝试构建多层全连接的神经网络,并且自定义网络模型并在此基础上尝试卷积网络。
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激活函数。关于这个激活函数的自定义将会在下面讲到。
模型中的参数有一个示例,但是在实际的应用中,学习速率、优化器以及训练步长的不同可能会导致结果有很大的差异性。一般情况下,我们会使用类似于超参数搜索的方法来寻找一个最优的组合。
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拟合,在其中将会来处理具体的分类问题。我们只需要按照自身的需求来添加不同的层即可以完成一些复杂的图片识别或者其他处理操作。