深度学习 - 卷积神经网络,并与Python特征提取

卷积神经网络(或ConvNets)的生物激发的MLP的变体,它们具有不同的种类的层,并且每个层不同工作比通常的MLP层不同。如果您有兴趣了解更多关于ConvNets,好的当然是CS231n - 卷积神经Newtorks从视觉上识别。的细胞神经网络的体系结构示于下面的图片:

有规律的神经网络。
有规律的神经网络(从CS231n网站)。
一个ConvNet网络achitecture(从CS231n网站)。
一个ConvNet网络achitecture(从CS231n网站)。

正如你所看到的,ConvNets可与三维体积和这些3D体积的转换。我不会在这个岗位重复整个CS231n教程,所以如果你真的有兴趣,请花时间,然后再继续阅读。

意大利千层面和nolearn

其中一个Python包深学习,我真的很喜欢工作,是千层面nolearn。意大利千层面是基于Theano所以GPU的加速真的会造成很大的差别,以及他们对神经网络建立声明的方式是非常有帮助。该nolearn libary是周围神经网络软件包(包括千层面),可以帮助我们创建神经网络结构的过程中有很多,各层的检查等实用程序的集合

我什么都在这个岗位展示,是如何建立一个简单的ConvNet架构与一些卷积和汇聚层。I’m also going to show how you can use a ConvNet to train a feature extractor and then use it to extract features before feeding them into different models like SVM, Logistic Regression, etc. Many people use pre-trained ConvNet models and then remove the last output layer to extract the features from ConvNets that were trained on ImageNet datasets. This is usually called transfer learning because you can use layers from other ConvNets as feature extractors for different problems, since the first layer filters of the ConvNets works as edge detectors, they can be used as general feature detectors for other problems.

加载MNIST数据集

MNIST数据集是数字分类的最传统的数据集之一。我们将使用它的一个腌版本的Python,但首先,让导入的包,我们将需要使用:

进口matplotlib进口matplotlib.pyplot作为PLT进口matplotlib.cm从进口的urllib进口urlretrieve cPickle的作为泡菜进口OS进口gzip的进口numpy的作为NP进口从lasagne.updates烤宽面条进口层theano进口烤宽面条厘米从nolearn.lasagne进口导入nesterov_momentum NeuralNet从sklearn.metrics nolearn.lasagne进口形象化导入classification_report从sklearn.metrics进口confusion_matrix

正如你所看到的,我们正在绘制一些图像导入matplotlib,一些原生的Python模块下载MNIST数据集,numpy的,theano,烤宽面条,nolearn和模型评估一些scikit学习功能。

在那之后,我们定义MNIST加载函数(这是相当的意大利千层面教程中使用的相同的功能):

DEF load_dataset():URL = 'http://deeplearning.net/data/mnist/mnist.pkl.gz' 文件名= 'mnist.pkl.gz' 如果不是os.path.exists(文件名):打印(“下载MNIST数据集...“)urlretrieve(URL,文件名)与gzip.open(文件名, 'RB')为f:数据=和pickle.load(F)X_train,y_train =数据[0] X_val,y_val =数据[1] X_test,y_test =数据[2] = X_train X_train.reshape(( -  1,1,28,28))X_val = X_val.reshape(( -  1,1,28,28))X_test = X_test.reshape((-1,1,28,28))y_train = y_train.astype(np.uint8)y_val = y_val.astype(np.uint8)y_test = y_test.astype(np.uint8)返回X_train,y_train,X_val,y_val,X_test,y_test

正如你所看到的,我们正在下载MNIST腌制数据集,然后拆开包装成三个不同的数据集:训练,验证和测试。之后,我们重塑图像内容到他们以后准备输入到千层面输入层并且我们也转换numpy的阵列类型UINT8由于GPU / theano数据类型的限制。

在那之后,我们已经准备好装载MNIST数据集并检查:

X_train,y_train,X_val,y_val,X_test,y_test = load_dataset()plt.imshow(X_train [0] [0],CMAP = cm.binary)

此代码以上将输出以下图像(我使用IPython的笔记本):

一个数字MNIST(5中的情况下)的一个例子。
一个数字MNIST(5中的情况下)的一个例子。

ConvNet架构和培训

现在,我们可以定义我们ConvNet架构,然后用GPU / CPU(我有一个非常便宜的GPU,但是它有很大帮助)训练它:亚洲金博宝

NET1 = NeuralNet(层= [( '输入',layers.InputLayer),( 'conv2d1',layers.Conv2DLayer),( 'maxpool1',layers.MaxPool2DLayer),( 'conv2d2',layers.Conv2DLayer),('maxpool2”,layers.MaxPool2DLayer),( 'dropout1',layers.DropoutLayer),( '密',layers.DenseLayer),( 'dropout2',layers.DropoutLayer),( '输出',layers.DenseLayer)],#输入层input_shape =(无,1,28,28),#层conv2d1 conv2d1_num_filters = 32,conv2d1_filter_size =(5,5),conv2d1_nonlinearity = lasagne.nonlinearities.rectify,conv2d1_W = lasagne.init.GlorotUniform(),#层maxpool1maxpool1_pool_size =(2,2),#层conv2d2 conv2d2_num_filters = 32,conv2d2_filter_size =(5,5),conv2d2_nonlinearity = lasagne.nonlinearities.rectify,#层maxpool2 maxpool2_pool_size =(2,2),#dropout1 dropout1_p = 0.5,#密dense_num_units = 256,dense_nonlinearity = lasagne.nonlinearities.rectify,#dropout2 dropout2_p = 0.5,#输出output_nonlinearity = lasagne.nonlinearities.softmax,output_num_units = 10,#优化方法PARAMS更新=未列名terov_momentum,update_learning_rate = 0.01,update_momentum = 0.9,max_epochs = 10,详细= 1,)#列车网络NN = net1.fit(X_train,y_train)

正如你所看到的,在参数我们定义与该层的名称/类型的元组的字典,然后我们定义为这些层的参数。我们在这里的结构是利用两个卷积层用poolings然后完全连接层(致密层)和输出层。也有一些层之间遗失,漏失层为正则该随机设定的输入值为零,以避免过度拟合(见下面的图)。

漏失层效果(从CS231n网站)。
漏失层效果(从CS231n网站)。

调用后培养法,nolearn包会显示我的卑微的GPU我得到下面的结果学习过程中的地位,在我的机器:

#神经网络160362个可学习参数##层信息#名称大小--- -------- -------- 0输入1x28x28 1 conv2d1 32x24x24 2 maxpool1 32x12x12 3 conv2d2 32x8x8 4 maxpool2 32x4x4 5 dropout132x4x4 6密256 7 dropout2 256 8输出10划时代列车损失有效损失火车/ VAL有效ACC DUR ------- ------------ -----------  ----------- --------- --- 1 0.85204 0.16707 5.09977 0.95174 33.71s 2 0.27571 0.10732 2.56896 0.96825 3 33.34s 0.20262 0.08567 2.36524 0.97488 33.51s 4 0.16551 0.07695 2.150810.97705 33.50s 5 0.14173 0.06803 2.08322 0.98061 34.38s 6 0.12519 0.06067 2.06352 0.98239 34.02s 7 0.11077 0.05532 2.00254 0.98427 33.78s 8 0.10497 0.05771 1.81898 0.98248 34.17s 9 0.09881 0.05159 1.91509 0.98407 10 33.80s 0.09264 0.04958 1.86864 0.98526 33.40s

正如你所看到的,到底准确度为0.98526,一个相当不错的表现,适合于10个时期的培训。

预测和混淆矩阵

现在,我们可以用模型来预测整个测试数据集:

preds = net1.predict(X_test)

而且我们还可以绘制一个混淆矩阵检查神经网络分类的性能:

厘米= confusion_matrix(y_test,preds)plt.matshow(厘米)plt.title( '混淆矩阵')plt.colorbar()plt.ylabel( '真标签')plt.xlabel( '预测标签')plt.show()

上面的代码将绘制以下混淆矩阵:

混淆矩阵
混淆矩阵

正如你所看到的,对角线,其中分类更加密集,显示我们分类的良好性能。

过滤器的可视化

我们也可以想像从第一卷积层32层的过滤器:

visualize.plot_conv_weights(net1.layers _ [ 'conv2d1'])

上面的代码将绘制下面以下过滤器:

第一层5x5x32滤波器。
第一层5x5x32滤波器。

正如你所看到的,nolearnplot_conv_weights地块所有过滤器呈现我们指定的层。

Theano层的功能和特征提取

现在是时候创建theano编译功能,将前馈输入数据到结构到层你有兴趣。我要得到输出层,也为输出层前的致密层的功能:

dense_layer = layers.get_output(net1.layers _ [ '密'],确定性=真)output_layer = layers.get_output(net1.layers _ [ '输出'],确定性=真)input_var = net1.layers _ [ '输入']。input_varf_output = theano.function([input_var],output_layer)f_dense = theano.function([input_var],dense_layer)

正如你可以看到,我们有一个叫做现在二人theano功能f_outputf_dense(用于输出和致密层)。请注意,在这里为了让大家层使用称为额外的参数“确定性“,这是为了避免影响我们的前馈通辍学层。

现在,我们可以示例实例转换到输入格式,然后将其馈送到用于输出层theano功能:

实例= X_test [0] [无,:,:]%timeit -n 500 f_output(实例)500个循环,最好的3:858微秒每循环

正如你所看到的,f_output功能需要的858微秒的平均水平。我们也可以绘制实例的输出层激活:

PRED = f_output(实例)N = pred.shape [1] plt.bar(范围(N),pred.ravel())

上面的代码将创建以下情节:

输出层激活。
输出层激活。

正如你所看到的,该数字被认为是数字7,你可以对网络中的任何一层创建theano功能事实上是非常有用的,因为你可以创建一个函数(像我们以前那样),以获得密集的激活亚洲金博宝层(输出层前的一个),你可以使用这些激活的功能和使用你的神经网络没有分类,但作为一个特征提取。对于致密层我们绘制现在256个单位激活:

PRED = f_dense(实例)N = pred.shape [1] plt.bar(范围(N),pred.ravel())

上面的代码将创建下面的情节如下:

致密层激活。
致密层激活。

现在,您可以使用这些256个激活的输出功能,像Logistic回归或SVM线性分类。

我希望你喜欢的教程!

引用本文为:基督教S. Perone,“深度学习 - 卷积神经网络,并与Python特征提取”,在亚洲金博宝未知领域,19/08/2015,//www.cpetem.com/2015/08/convolutional-neural-networks-and-feature-extraction-with-python/