ÕªÒª£º±¾ÎÄչʾÁËÈçºÎ»ùÓÚnolearnʹÓÃһЩ¾í»ý²ãºÍ³Ø»¯²ãÀ´½¨Á¢Ò»¸ö¼òµ¥µÄConvNetÌåϵ½á¹¹£¬ÒÔ¼°ÈçºÎʹÓÃConvNetȥѵÁ·Ò»¸öÌØÕ÷ÌáÈ¡Æ÷£¬È»ºóÔÚʹÓÃÈçSVM¡¢Logistic»Ø¹éµÈ²»Í¬µÄÄ£ÐÍ֮ǰʹÓÃËüÀ´½øÐÐÌØÕ÷ÌáÈ¡¡£
¾í»ýÉñ¾ÍøÂ磨ConvNets£©ÊÇÊÜÉúÎïÆô·¢µÄMLPs£¨¶à²ã¸ÐÖªÆ÷£©£¬ËüÃÇÓÐ×Ų»Í¬Àà±ðµÄ²ã£¬²¢ÇÒÿ²ãµÄ¹¤×÷·½Ê½ÓëÆÕͨµÄMLP²ãÒ²ÓÐËù²îÒì¡£Èç¹ûÄã¶ÔConvNets¸ÐÐËȤ£¬ÕâÀïÓиöºÜºÃµÄ½Ì³ÌCS231n ¨C Convolutional Neural Newtorks for Visual Recognition¡£CNNsµÄÌåϵ½á¹¹ÈçÏÂËùʾ£º

³£¹æµÄÉñ¾ÍøÂ磨À´×ÔCS231nÍøÕ¾£©

ConvNetÍøÂçÌåϵ½á¹¹£¨À´×ÔCS231nÍøÕ¾£©
ÈçÄãËù¼û£¬ConvNets¹¤×÷ʱ°éËæ×Å3D¾í»ý²¢ÇÒÔÚ²»¶Ïת±ä×ÅÕâЩ3D¾í»ý¡£ÎÒÔÚÕâÆªÎÄÕÂÖв»»áÔÙÖØ¸´Õû¸öCS231nµÄ½Ì³Ì£¬ËùÒÔÈç¹ûÄãÕæµÄ¸ÐÐËȤ£¬ÇëÔÚ¼ÌÐøÔĶÁ֮ǰÏÈ»¨µãʱ¼äȥѧϰһÏ¡£
Lasagne ºÍ nolearn
LasagneºÍnolearnÊÇÎÒ×îϲ»¶Ê¹ÓõÄÉî¶ÈѧϰPython°ü¡£LasagneÊÇ»ùÓÚTheanoµÄ£¬ËùÒÔGPUµÄ¼ÓËÙ½«´óÓв»Í¬£¬²¢ÇÒÆä¶ÔÉñ¾ÍøÂç´´½¨µÄÉùÃ÷·½·¨Ò²ºÜÓаïÖú¡£nolearn¿âÊÇÒ»¸öÉñ¾ÍøÂçÈí¼þ°üʵÓóÌÐò¼¯£¨°üº¬Lasagne£©£¬ËüÔÚÉñ¾ÍøÂçÌåϵ½á¹¹µÄ´´½¨¹ý³ÌÉÏ¡¢¸÷²ãµÄ¼ìÑéµÈ¶¼Äܹ»¸øÎÒÃǺܴóµÄ°ïÖú¡£
ÔÚÕâÆªÎÄÕÂÖÐÎÒҪչʾµÄÊÇ£¬ÈçºÎʹÓÃһЩ¾í»ý²ãºÍ³Ø»¯²ãÀ´½¨Á¢Ò»¸ö¼òµ¥µÄConvNetÌåϵ½á¹¹¡£ÎÒ»¹½«ÏòÄãչʾÈçºÎʹÓÃConvNetȥѵÁ·Ò»¸öÌØÕ÷ÌáÈ¡Æ÷£¬ÔÚʹÓÃÈçSVM¡¢Logistic»Ø¹éµÈ²»Í¬µÄÄ£ÐÍ֮ǰʹÓÃËüÀ´½øÐÐÌØÕ÷ÌáÈ¡¡£´ó¶àÊýÈËʹÓõÄÊÇԤѵÁ·ConvNetÄ£ÐÍ£¬È»ºóɾ³ý×îºóÒ»¸öÊä³ö²ã£¬½Ó×Å´ÓImageNetsÊý¾Ý¼¯ÉÏѵÁ·µÄConvNetsÍøÂçÌáÈ¡ÌØÕ÷¡£Õâͨ³£±»³ÆÎªÊÇÇ¨ÒÆÑ§Ï°£¬ÒòΪ¶ÔÓÚ²»Í¬µÄÎÊÌâÄã¿ÉÒÔʹÓÃÀ´×ÔÆäËüµÄConvNets²ã£¬ÓÉÓÚConvNetsµÄµÚÒ»²ã¹ýÂËÆ÷±»µ±×öÊÇÒ»¸ö±ßԵ̽²âÆ÷£¬ËùÒÔËüÃÇ¿ÉÒÔÓÃÀ´×÷ΪÆäËüÎÊÌâµÄÆÕÍ¨ÌØÕ÷̽²âÆ÷¡£
¼ÓÔØMNISTÊý¾Ý¼¯
MNISTÊý¾Ý¼¯ÊÇÓÃÓÚÊý×Öʶ±ð×ͳµÄÊý¾Ý¼¯Ö®Ò»¡£ÎÒÃÇʹÓõÄÊÇÒ»¸öÃæÏòPythonµÄ°æ±¾£¬µ«ÏÈÈÃÎÒÃǵ¼ÈëÐèҪʹÓõİü£º
import matplotlib import matplotlib.pyplot as plt import matplotlib.cm as cm from urllib import urlretrieve import cPickle as pickle import os import gzip import numpy as np import theano import lasagne from lasagne import layers from lasagne.updates import nesterov_momentum from nolearn.lasagne import NeuralNet from nolearn.lasagne import visualize from sklearn.metrics import classification_report from sklearn.metrics import confusion_matrix |
ÕýÈçÄãËù¿´µ½µÄ£¬ÎÒÃǵ¼ÈëÁËÓÃÓÚ»æÍ¼µÄmatplotlib°ü£¬Ò»Ð©ÓÃÓÚÏÂÔØMNISTÊý¾Ý¼¯µÄÔÉúPythonÄ£¿é£¬numpy£¬ theano£¬lasagne£¬nolearn ÒÔ¼° scikit-learn¿âÖÐÓÃÓÚÄ£ÐÍÆÀ¹ÀµÄһЩº¯Êý¡£
È»ºó£¬ÎÒÃǶ¨ÒåÒ»¸ö¼ÓÔØMNISTÊý¾Ý¼¯µÄº¯Êý£¨Õâ¸ö¹¦ÄÜÓëLasagne½Ì³ÌÉÏʹÓõķdz£ÏàËÆ£©
def load_dataset(): url = 'http://deeplearning.net/data/mnist/mnist.pkl.gz' filename = 'mnist.pkl.gz' if not os.path.exists(filename): print("Downloading MNIST dataset...") urlretrieve(url, filename) with gzip.open(filename, 'rb') as f: data = pickle.load(f) X_train, y_train = data[0] X_val, y_val = data[1] X_test, y_test = data[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) return X_train, y_train, X_val, y_val, X_test, y_test |
ÕýÈçÄã¿´µ½µÄ£¬ÎÒÃÇÕýÔÚÏÂÔØ´¦Àí¹ýµÄMNISTÊý¾Ý¼¯£¬½Ó×ŰÑËü²ð·ÖΪÈý¸ö²»Í¬µÄÊý¾Ý¼¯£¬·Ö±ðÊÇ£ºÑµÁ·¼¯¡¢ÑéÖ¤¼¯ºÍ²âÊÔ¼¯¡£È»ºóÖØÖÃͼÏñÄÚÈÝ£¬ÎªÖ®ºóµÄLasagneÊäÈë²ã×ö×¼±¸£¬Óë´Ëͬʱ£¬ÓÉÓÚGPU/theanoÊý¾ÝÀàÐ͵ÄÏÞÖÆ£¬ÎÒÃÇ»¹°ÑnumpyµÄÊý¾ÝÀàÐÍת»»³ÉÁËuint8¡£
Ëæºó£¬ÎÒÃÇ×¼±¸¼ÓÔØ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 Notebook£©

Ò»¸öMNISTÊý¾Ý¼¯µÄÊý×ÖʵÀý£¨¸ÃʵÀýÊÇ5£©
ConvNetÌåϵ½á¹¹ÓëѵÁ·
ÏÖÔÚ£¬¶¨ÒåÎÒÃǵÄConvNetÌåϵ½á¹¹£¬È»ºóʹÓõ¥GPU/CPUÀ´ÑµÁ·Ëü£¨ÎÒÓÐÒ»¸ö·Ç³£Á®¼ÛµÄGPU£¬µ«ËüºÜÓÐÓã©
net1 = NeuralNet( layers=[('input', layers.InputLayer), ('conv2d1', layers.Conv2DLayer), ('maxpool1', layers.MaxPool2DLayer), ('conv2d2', layers.Conv2DLayer), ('maxpool2', layers.MaxPool2DLayer), ('dropout1', layers.DropoutLayer), ('dense', layers.DenseLayer), ('dropout2', layers.DropoutLayer), ('output', layers.DenseLayer), ], # input layer input_shape=(None, 1, 28, 28), # layer conv2d1 conv2d1_num_filters=32, conv2d1_filter_size=(5, 5), conv2d1_nonlinearity=lasagne.nonlinearities.rectify, conv2d1_W=lasagne.init.GlorotUniform(), # layer maxpool1 maxpool1_pool_size=(2, 2), # layer conv2d2 conv2d2_num_filters=32, conv2d2_filter_size=(5, 5), conv2d2_nonlinearity=lasagne.nonlinearities.rectify, # layer maxpool2 maxpool2_pool_size=(2, 2), # dropout1 dropout1_p=0.5, # dense dense_num_units=256, dense_nonlinearity=lasagne.nonlinearities.rectify, # dropout2 dropout2_p=0.5, # output output_nonlinearity=lasagne.nonlinearities.softmax, output_num_units=10, # optimization method params update=nesterov_momentum, update_learning_rate=0.01, update_momentum=0.9, max_epochs=10, verbose=1, ) # Train the network nn = net1.fit(X_train, y_train) |
ÈçÄãËùÊÓ£¬ÔÚlayersµÄ²ÎÊýÖУ¬ÎÒÃǶ¨ÒåÁËÒ»¸öÓвãÃû³Æ/ÀàÐ͵ÄÔª×é×ֵ䣬Ȼºó¶¨ÒåÁËÕâЩ²ãµÄ²ÎÊý¡£ÔÚÕâÀÎÒÃǵÄÌåϵ½á¹¹Ê¹ÓõÄÊÇÁ½¸ö¾í»ý²ã£¬Á½¸ö³Ø»¯²ã£¬Ò»¸öÈ«Á¬½Ó²ã£¨³íÃܲ㣬dense layer£©ºÍÒ»¸öÊä³ö²ã¡£ÔÚһЩ²ãÖ®¼äÒ²»áÓÐdropout²ã£¬dropout²ãÊÇÒ»¸öÕýÔò»¯¾ØÕó£¬Ëæ»úµÄÉèÖÃÊäÈëֵΪÁãÀ´±ÜÃâ¹ýÄâºÏ£¨¼ûÏÂͼ£©¡£

Dropout²ãЧ¹û£¨À´×ÔCS231nÍøÕ¾£©
µ÷ÓÃѵÁ··½·¨ºó£¬nolearn°ü½«»áÏÔʾѧϰ¹ý³ÌµÄ״̬£¬ÎҵĻúÆ÷ʹÓõÄÊǵͶ˵ĵÄGPU£¬µÃµ½µÄ½á¹ûÈçÏ£º
# Neural Network with 160362 learnable parameters ## Layer information # name size --- -------- -------- 0 input 1x28x28 1 conv2d1 32x24x24 2 maxpool1 32x12x12 3 conv2d2 32x8x8 4 maxpool2 32x4x4 5 dropout1 32x4x4 6 dense 256 7 dropout2 256 8 output 10 epoch train loss valid loss train/val valid acc dur ------- ------------ ------------ ----------- --------- --- 1 0.85204 0.16707 5.09977 0.95174 33.71s 2 0.27571 0.10732 2.56896 0.96825 33.34s 3 0.20262 0.08567 2.36524 0.97488 33.51s 4 0.16551 0.07695 2.15081 0.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 33.80s 10 0.09264 0.04958 1.86864 0.98526 33.40s |
ÕýÈçÄã¿´µ½µÄ£¬×îºóÒ»´ÎµÄ¾«¶È¿ÉÒÔ´ïµ½0.98526£¬ÊÇÕâ10¸öµ¥ÔªÑµÁ·ÖеÄÒ»¸öÏ൱²»´íµÄÐÔÄÜ¡£
Ô¤²âºÍ»ìÏý¾ØÕó
ÏÖÔÚ£¬ÎÒÃÇʹÓÃÕâ¸öÄ£ÐÍÀ´Ô¤²âÕû¸ö²âÊÔ¼¯£º
preds = net1.predict(X_test) |
ÎÒÃÇ»¹¿ÉÒÔ»æÖÆÒ»¸ö»ìÏý¾ØÕóÀ´¼ì²éÉñ¾ÍøÂçµÄ·ÖÀàÐÔÄÜ£º
cm = confusion_matrix(y_test, preds) plt.matshow(cm) plt.title('Confusion matrix') plt.colorbar() plt.ylabel('True label') plt.xlabel('Predicted label') plt.show() |
ÉÏÃæµÄ´úÂ뽫»æÖÆÏÂÃæµÄ»ìÏý¾ØÕó£º

»ìÏý¾ØÕó
ÈçÄãËùÊÓ£¬¶Ô½ÇÏßÉϵķÖÀà¸üÃܼ¯£¬±íÃ÷ÎÒÃǵķÖÀàÆ÷ÓÐÒ»¸öÁ¼ºÃµÄÐÔÄÜ¡£
¹ýÂËÆ÷µÄ¿ÉÊÓ»¯
ÎÒÃÇ»¹¿ÉÒÔ´ÓµÚÒ»¸ö¾í»ý²ãÖпÉÊÓ»¯32¸ö¹ýÂËÆ÷£º
visualize.plot_conv_weights(net1.layers_['conv2d1']) |
ÉÏÃæµÄ´úÂ뽫»æÖÆÏÂÃæµÄ¹ýÂËÆ÷£º

µÚÒ»²ãµÄ5x5x32¹ýÂËÆ÷
ÈçÄãËùÊÓ£¬nolearnµÄplot_conv_weightsº¯ÊýÔÚÎÒÃÇÖ¸¶¨µÄ²ãÖлæÖƳöÁËËùÓеĹýÂËÆ÷¡£
Theano²ãµÄ¹¦ÄܺÍÌØÕ÷ÌáÈ¡
ÏÖÔÚ¿ÉÒÔ´´½¨theano±àÒëµÄº¯ÊýÁË£¬Ëü½«Ç°À¡ÊäÈëÊý¾ÝÊäË͵½½á¹¹ÌåϵÖУ¬ÉõÖÁÊÇÄã¸ÐÐËȤµÄijһ²ãÖС£½Ó×Å£¬ÎÒ»áµÃµ½Êä³ö²ãµÄº¯ÊýºÍÊä³ö²ãÇ°ÃæµÄ³íÃܲ㺯Êý¡£
dense_layer = layers.get_output(net1.layers_['dense'], deterministic=True) output_layer = layers.get_output(net1.layers_['output'], deterministic=True) input_var = net1.layers_['input'].input_var f_output = theano.function([input_var], output_layer) f_dense = theano.function([input_var], dense_layer) |
ÈçÄãËùÊÓ£¬ÎÒÃÇÏÖÔÚÓÐÁ½¸ötheanoº¯Êý£¬·Ö±ðÊÇf_outputºÍf_dense£¨ÓÃÓÚÊä³ö²ãºÍ³íÃܲ㣩¡£Çë×¢Ò⣬ÔÚÕâÀïΪÁ˵õ½ÕâЩ²ã£¬ÎÒÃÇʹÓÃÁËÒ»¸ö¶îÍâµÄ½Ð×ö¡°deterministic¡±µÄ²ÎÊý£¬ÕâÊÇΪÁ˱ÜÃâdropout²ãÓ°ÏìÎÒÃǵÄǰÀ¡²Ù×÷¡£
ÏÖÔÚ£¬ÎÒÃÇ¿ÉÒÔ°ÑʵÀýת»»ÎªÊäÈë¸ñʽ£¬È»ºóÊäÈëµ½theanoº¯ÊýÊä³ö²ãÖУº
instance = X_test[0][None, :, :] %timeit -n 500 f_output(instance) 500 loops, best of 3: 858 ¦Ìs per loop |
ÈçÄãËùÊÓ£¬f_outputº¯Êýƽ¾ùÐèÒª858¦Ìs¡£ÎÒÃÇͬÑù¿ÉÒÔΪÕâ¸öʵÀý»æÖÆÊä³ö²ã¼¤»îÖµ½á¹û£º
pred = f_output(instance) N = pred.shape[1] plt.bar(range(N), pred.ravel()) |
ÉÏÃæµÄ´úÂ뽫»æÖƳöÏÂÃæµÄͼ£º

Êä³ö²ã¼¤»îÖµ
ÕýÈçÄãËù¿´µ½µÄ£¬Êý×Ö±»ÈÏΪÊÇ7¡£ÊÂʵÊÇΪÈκÎÍøÂç²ã´´½¨theanoº¯Êý¶¼ÊǷdz£ÓÐÓõģ¬ÒòΪÄã¿ÉÒÔ´´½¨Ò»¸öº¯Êý£¨ÏñÎÒÃÇÒÔǰһÑù£©µÃµ½³íÃܲ㣨Êä³ö²ãǰһ¸ö£©µÄ¼¤»îÖµ£¬È»ºóÄã¿ÉÒÔʹÓÃÕâЩ¼¤»îÖµ×÷ÎªÌØÕ÷£¬²¢ÇÒʹÓÃÄãµÄÉñ¾ÍøÂç×÷ÎªÌØÕ÷ÌáÈ¡Æ÷¶ø²»ÊÇ·ÖÀàÆ÷¡£ÏÖÔÚ£¬ÈÃÎÒÃÇΪ³íÃÜ²ã»æÖÆ256¸ö¼¤»îµ¥Ôª£º
pred = f_dense(instance) N = pred.shape[1] plt.bar(range(N), pred.ravel()) |
ÉÏÃæµÄ´úÂ뽫»æÖÆÏÂÃæµÄͼ£º
 ³íÃܲ㼤»îÖµ
ÏÖÔÚ£¬Äã¿ÉÒÔʹÓÃÊä³öµÄÕâ256¸ö¼¤»îÖµ×÷ΪÏßÐÔ·ÖÀàÆ÷ÈçLogistic»Ø¹é»òÖ§³ÖÏòÁ¿»úµÄÌØÕ÷ÁË¡£
×îºó£¬ÎÒÏ£ÍûÄã»áϲ»¶Õâ¸ö½Ì³Ì¡£ |