CNN通俗解析

摘要:CNN基礎(chǔ)知識(shí)介紹及TensorFlow具體實(shí)現(xiàn),對(duì)于初學(xué)者或者求職者而言是一份不可多得的資料解藻。

定義:

簡而言之,卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Networks)是一種深度學(xué)習(xí)模型或類似于人工神經(jīng)網(wǎng)絡(luò)的多層感知器葡盗,常用來分析視覺圖像螟左。卷積神經(jīng)網(wǎng)絡(luò)的創(chuàng)始人是著名的計(jì)算機(jī)科學(xué)家Yann LeCun,目前在Facebook工作,他是第一個(gè)通過卷積神經(jīng)網(wǎng)絡(luò)在MNIST數(shù)據(jù)集上解決手寫數(shù)字問題的人胶背。

Yann LeCunn

卷積神經(jīng)網(wǎng)絡(luò)的出現(xiàn)是受到了生物處理過程的啟發(fā)巷嚣,因?yàn)樯窠?jīng)元之間的連接模式類似于動(dòng)物的視覺皮層組織。

人腦的視覺結(jié)構(gòu)

個(gè)體皮層神經(jīng)元僅在被稱為感受野的視野受限區(qū)域中對(duì)刺激作出反應(yīng)钳吟,不同神經(jīng)元的感受野部分重疊廷粒,使得它們能夠覆蓋整個(gè)視野。

計(jì)算機(jī)視覺與人類視覺

正如上圖所示红且,我們?cè)谡務(wù)撊魏晤愋偷纳窠?jīng)網(wǎng)絡(luò)時(shí)坝茎,都不可能不提及一點(diǎn)神經(jīng)科學(xué)以及人體(特別是大腦)及其功能相關(guān)的知識(shí),這些知識(shí)成為創(chuàng)建各種深度學(xué)習(xí)模型的主要靈感的來源暇番。

卷積神經(jīng)網(wǎng)絡(luò)的架構(gòu):

卷積神經(jīng)網(wǎng)絡(luò)架構(gòu)

如上圖所示嗤放,卷積神經(jīng)網(wǎng)絡(luò)架構(gòu)與常規(guī)人工神經(jīng)網(wǎng)絡(luò)架構(gòu)非常相似,特別是在網(wǎng)絡(luò)的最后一層奔誓,即全連接。此外搔涝,還注意到卷積神經(jīng)網(wǎng)絡(luò)能夠接受多個(gè)特征圖作為輸入厨喂,而不是向量。

下面讓我們探索構(gòu)成卷積神經(jīng)網(wǎng)絡(luò)的基本構(gòu)件及相關(guān)的數(shù)學(xué)運(yùn)算過程庄呈,并根據(jù)在訓(xùn)練過程中學(xué)到的特征和屬性對(duì)圖像進(jìn)行可視化和分類蜕煌。

輸入層|Input Layer:

輸入層主要是n×m×3 RGB圖像,這不同于人工神經(jīng)網(wǎng)絡(luò)诬留,人工神經(jīng)網(wǎng)絡(luò)的輸入是n×1維的矢量斜纪。

RGB圖像

卷積層|Convolution Layer:

在卷積層中,計(jì)算輸入圖像的區(qū)域和濾波器的權(quán)重矩陣之間的點(diǎn)積文兑,并將其結(jié)果作為該層的輸出盒刚。濾波器將滑過整個(gè)圖像,重復(fù)相同的點(diǎn)積運(yùn)算绿贞。這里注意兩件事:

? 濾波器必須具有與輸入圖像相同數(shù)量的通道因块;

? 網(wǎng)絡(luò)越深,使用的濾波器就越多籍铁;擁有的濾波器越多涡上,獲得的邊緣和特征檢測就越多;

前向卷積運(yùn)算

卷積層輸出的尺寸:

輸出寬度

輸出高度

其中:

? W :輸入圖像的寬度

? H :輸入圖像的高度

? Fw? :濾波器或內(nèi)核的寬度

? Fh :濾波器的高度

? P :填充

? S :移動(dòng)步幅

卷積層輸出的通道數(shù)等于卷積操作期間使用的濾波器的個(gè)數(shù)拒名。

為什么選擇卷積吩愧?

有時(shí)候可能會(huì)問自己,為什么要首先使用卷積操作增显?為什么不從一開始就展開輸入圖像矩陣雁佳?在這里給出答案,如果這樣做,我們最終會(huì)得到大量需要訓(xùn)練的參數(shù)甘穿,而且大多數(shù)人都沒有能夠以最快的方式解決計(jì)算成本高昂任務(wù)的能力腮恩。此外,由于卷積神經(jīng)網(wǎng)絡(luò)具有的參數(shù)會(huì)更少温兼,因此就可以避免出現(xiàn)過擬合現(xiàn)象秸滴。

池化層|Pooling Layer:

目前,有兩種廣泛使用的池化操作——平均池化(average pooling)和最大池化(max pooling)募判,其中最大池化是兩者中使用最多的一個(gè)操作荡含,其效果一般要優(yōu)于平均池化。池化層用于在卷積神經(jīng)網(wǎng)絡(luò)上減小特征空間維度届垫,但不會(huì)減小深度释液。當(dāng)使用最大池化層時(shí),采用輸入?yún)^(qū)域的最大數(shù)量装处,而當(dāng)使用平均池化時(shí)误债,采用輸入?yún)^(qū)域的平均值。

最大池化

為什么要池化妄迁?

池化層的核心目標(biāo)之一是提供空間方差寝蹈,這意味著你或機(jī)器將能夠?qū)?duì)象識(shí)別出來,即使它的外觀以某種方式發(fā)生改變登淘,更多關(guān)于池化層的內(nèi)容可以查看Yann LeCunn的文章箫老。

非線性層|Non-linearity Layer:

在非線性層中,一般使用ReLU激活函數(shù)黔州,而不是使用傳統(tǒng)的Sigmoid或Tan-H激活函數(shù)耍鬓。對(duì)于輸入圖像中的每個(gè)負(fù)值流妻,ReLU激活函數(shù)都返回0值,而對(duì)于輸入圖像中的每個(gè)正值各薇,它返回相同的值(有關(guān)激活函數(shù)的更深入說明,請(qǐng)查看這篇文章)君躺。

ReLU激活函數(shù)

全連接層}Fully Connected Layer:

在全連接層中棕叫,我們將最后一個(gè)卷積層的輸出展平林螃,并將當(dāng)前層的每個(gè)節(jié)點(diǎn)與下一層的另一個(gè)節(jié)點(diǎn)連接起來。全連接層只是人工神經(jīng)網(wǎng)絡(luò)的另一種說法疗认,如下圖所示。全連接層中的操作與一般的人工神經(jīng)網(wǎng)絡(luò)中的操作完全相同:

卷積層展開

全連接層

上面討論的層和操作都是每個(gè)卷積神經(jīng)網(wǎng)絡(luò)的核心組件,現(xiàn)在已經(jīng)討論了卷積神經(jīng)網(wǎng)絡(luò)在前向傳播中經(jīng)歷的操作扎拣,下面讓我們跳轉(zhuǎn)到卷積神經(jīng)網(wǎng)絡(luò)在反向傳播中經(jīng)歷的操作素跺。

反向傳播|Backpropagation:

全連接層:

在全連接層中指厌,反向傳播與任何常規(guī)人工神經(jīng)網(wǎng)絡(luò)完全相同,在反向傳播中(使用梯度下降作為優(yōu)化算法)鸥诽,使用損失函數(shù)的偏導(dǎo)數(shù)即損失函數(shù)關(guān)于權(quán)重的導(dǎo)數(shù)來更新參數(shù)牡借,其中我們將損失函數(shù)的導(dǎo)數(shù)與激活輸出相乘厕九,激活輸出的導(dǎo)數(shù)與非激活輸出相乘扁远,導(dǎo)數(shù)為未激活的輸出與權(quán)重相對(duì)應(yīng)刻像。

數(shù)學(xué)表達(dá)式如下:

在計(jì)算梯度之后细睡,我們從初始權(quán)重中減去它以得到新的優(yōu)化:

反向傳播說明圖

其中:

? θi+ 1 :優(yōu)化的權(quán)重

? θi:初始權(quán)重

? α :學(xué)習(xí)率

? ?J(θi):損失函數(shù)的梯度

梯度下降

在下面的動(dòng)態(tài)圖中溜徙,是將梯度下降應(yīng)用于線性回歸的結(jié)果蠢壹。從圖中可以清楚地看到代價(jià)函數(shù)越小,線性模型越適合數(shù)據(jù)图贸。

梯度下降應(yīng)用于線性回歸

此外,請(qǐng)注意一點(diǎn)撒汉,應(yīng)該謹(jǐn)慎地選擇學(xué)習(xí)率的取值涕滋,學(xué)習(xí)率太高可能會(huì)導(dǎo)致梯度超過目標(biāo)最小值何吝, 學(xué)習(xí)率太低可能導(dǎo)致網(wǎng)絡(luò)模型收斂速度變慢爱榕。

小學(xué)習(xí)率與大學(xué)習(xí)率

在所有優(yōu)化任務(wù)中黔酥,無論是在物理學(xué)、經(jīng)濟(jì)學(xué)還是計(jì)算機(jī)科學(xué)中棵帽,偏導(dǎo)數(shù)都被大量使用逗概。偏導(dǎo)數(shù)主要用于計(jì)算因變量f(x, y, z)相對(duì)于其獨(dú)立變量之一的變化率逾苫。例如枚钓,假設(shè)你擁有一個(gè)公司的股份搀捷,后者的股票會(huì)根據(jù)多種因素(證券嫩舟、政治、銷售收入等)上漲或下跌播玖,在這種情況下通過偏導(dǎo)數(shù)黎棠,你會(huì)計(jì)算多少股票受到影響而其他因素保持不變脓斩,股票發(fā)生變化,則公司的價(jià)格也會(huì)發(fā)生變化八千。

池化層|Pooling Layer:

在最大池化特征圖層中恋捆,梯度僅通過最大值反向傳播重绷,因此稍微更改它們并不會(huì)影響輸出昭卓。在此過程中候醒,我們將最大池化操作之前的最大值替換為1倒淫,并將所有非最大值設(shè)置為零,然后使用鏈?zhǔn)椒▌t將漸變量乘以先前量以得到新的參數(shù)值镜硕。

池化層反向傳播

與最大池化層不同谦疾,在平均池化層中,梯度是通過所有的輸入(在平均合并之前)進(jìn)行傳播晚顷。

卷積層|Convolution Layer:

你可能現(xiàn)在問自己疗疟,如果卷積層的前向傳播是卷積策彤,那么它的反向傳播是什么?幸運(yùn)的是音榜,它的向后傳播也是一個(gè)卷積捧弃,所以你不必?fù)?dān)心學(xué)習(xí)新的難以掌握的數(shù)學(xué)運(yùn)算违霞。

卷積層反向傳播

其中:

? ?hij:損失函數(shù)的導(dǎo)數(shù)

image

簡而言之涧郊,上圖表明了反向傳播是如何在卷積層中起作用的⊙畚澹現(xiàn)在假設(shè)你已經(jīng)對(duì)卷積神經(jīng)網(wǎng)絡(luò)有了深刻的理論理解弹砚,下面讓我們用TensorFlow構(gòu)建的第一個(gè)卷積神經(jīng)網(wǎng)絡(luò)吧桌吃。

TensorFlow實(shí)現(xiàn)卷積神經(jīng)網(wǎng)絡(luò):

什么是Tensorflow茅诱?

TensorFlow是一個(gè)使用數(shù)據(jù)流圖進(jìn)行數(shù)值計(jì)算的開源軟件庫瑟俭。它最初由谷歌機(jī)器智能研究機(jī)構(gòu)谷歌大腦團(tuán)隊(duì)開發(fā),用于機(jī)器學(xué)習(xí)和深度神經(jīng)網(wǎng)絡(luò)的研究失暴。

什么是張量逗扒?

張量是一個(gè)有組織的多維數(shù)組矩肩,張量的順序是表示它所需數(shù)組的維數(shù)黍檩。

張量的類型

什么是計(jì)算圖刽酱?

計(jì)算圖是計(jì)算代數(shù)中的一個(gè)基礎(chǔ)處理方法,在機(jī)器學(xué)習(xí)中的神經(jīng)網(wǎng)絡(luò)和其他模型推導(dǎo)算法和軟件包方面非常富有成效艺配。計(jì)算圖中的基本思想是表達(dá)一些模型——例如前饋神經(jīng)網(wǎng)絡(luò)转唉,計(jì)算圖作為表示計(jì)算步驟序列的一個(gè)有向圖赠法。序列中的每個(gè)步驟對(duì)應(yīng)于計(jì)算圖中的頂點(diǎn)砖织, 每個(gè)步驟對(duì)應(yīng)一個(gè)簡單的操作末荐,每個(gè)操作接受一些輸入并根據(jù)其輸入產(chǎn)生一些輸出甲脏。

在下面的圖示中块请,我們有兩個(gè)輸入w1 = x和w2 = y墩新,這個(gè)輸入將流經(jīng)圖形,其中圖形中的每個(gè)節(jié)點(diǎn)都是數(shù)學(xué)運(yùn)算绵疲,為我們提供以下輸出:

? w3 = cos(x)最岗,余弦三角函數(shù)操作

? w4 = sin(x),正弦三角函數(shù)操作

? w5 = w3?w4芙盘,乘法操作

? w6 = w1 / w2儒老,除法操作

? w7 = w5 + w6,加法操作

現(xiàn)在我們了解了什么是計(jì)算圖薇正,下面讓我們TensorFlow中構(gòu)建自己的計(jì)算圖吧挖腰。

代碼:

# Import the deep learning libraryimporttensorflowastf# Define our compuational graph W1 = tf.constant(5.0, name ="x")W2 = tf.constant(3.0, name ="y")W3 = tf.cos(W1, name ="cos")W4 = tf.sin(W2, name ="sin")W5 = tf.multiply(W3, W4, name ="mult")W6 = tf.divide(W1, W2, name ="div")W7 = tf.add(W5, W6, name ="add")# Open the sessionwithtf.Session()assess:cos = sess.run(W3)sin = sess.run(W4)mult = sess.run(W5)div = sess.run(W6)add = sess.run(W7)# Before running TensorBoard, make sure you have generated summary data in a log directory by creating a summary writerwriter = tf.summary.FileWriter("./Desktop/ComputationGraph", sess.graph)# Once you have event files, run TensorBoard and provide the log directory# Command: tensorboard --logdir="path/to/logs"

使用Tensorboard進(jìn)行可視化:

什么是Tensorboard?

TensorBoard是一套用于檢查和理解TensorFlow運(yùn)行和圖形的Web應(yīng)用程序辽俗,這也是Google的TensorFlow比Facebook的Pytorch最大的優(yōu)勢之一篡诽。

上面的代碼在Tensorboard中進(jìn)行可視化

在卷積神經(jīng)網(wǎng)絡(luò)杈女、TensorFlow和TensorBoard有了深刻的理解碧信,下面讓我們一起構(gòu)建我們的第一個(gè)使用MNIST數(shù)據(jù)集識(shí)別手寫數(shù)字的卷積神經(jīng)網(wǎng)絡(luò)砰碴。

MNIST數(shù)據(jù)集

我們的卷積神經(jīng)網(wǎng)絡(luò)模型將似于LeNet-5架構(gòu)呈枉,由卷積層猖辫、最大池化和非線性操作層啃憎。

卷積神經(jīng)網(wǎng)絡(luò)三維仿真

代碼:

# Import the deep learning libraryimporttensorflowastfimporttime# Import the MNIST datasetfromtensorflow.examples.tutorials.mnistimportinput_datamnist = input_data.read_data_sets("/tmp/data/", one_hot=True)# Network inputs and outputs# The network's input is a 28×28 dimensional inputn =28m =28num_input = n * m# MNIST data input num_classes =10# MNIST total classes (0-9 digits)# tf Graph inputX = tf.placeholder(tf.float32, [None, num_input])Y = tf.placeholder(tf.float32, [None, num_classes])# Storing the parameters of our LeNET-5 inspired Convolutional Neural Networkweights = {"W_ij": tf.Variable(tf.random_normal([5,5,1,32])),"W_jk": tf.Variable(tf.random_normal([5,5,32,64])),"W_kl": tf.Variable(tf.random_normal([7*7*64,1024])),"W_lm": tf.Variable(tf.random_normal([1024, num_classes])) }biases = {"b_ij": tf.Variable(tf.random_normal([32])),"b_jk": tf.Variable(tf.random_normal([64])),"b_kl": tf.Variable(tf.random_normal([1024])),"b_lm": tf.Variable(tf.random_normal([num_classes])) }# The hyper-parameters of our Convolutional Neural Networklearning_rate =1e-3num_steps =500batch_size =128display_step =10defConvolutionLayer(x, W, b, strides=1):# Convolution Layerx = tf.nn.conv2d(x, W, strides=[1, strides, strides,1], padding='SAME')x = tf.nn.bias_add(x, b)returnxdefReLU(x):# ReLU activation functionreturntf.nn.relu(x)defPoolingLayer(x, k=2, strides=2):# Max Pooling layerreturntf.nn.max_pool(x, ksize=[1, k, k,1], strides=[1, strides, strides,1],? ? ? ? ? ? ? ? ? ? ? padding='SAME')defSoftmax(x):# Softmax activation function for the CNN's final outputreturntf.nn.softmax(x)# Create modeldefConvolutionalNeuralNetwork(x, weights, biases):# MNIST data input is a 1-D row vector of 784 features (28×28 pixels)# Reshape to match picture format [Height x Width x Channel]# Tensor input become 4-D: [Batch Size, Height, Width, Channel]x = tf.reshape(x, shape=[-1,28,28,1])# Convolution LayerConv1 = ConvolutionLayer(x, weights["W_ij"], biases["b_ij"])# Non-LinearityReLU1 = ReLU(Conv1)# Max Pooling (down-sampling)Pool1 = PoolingLayer(ReLU1, k=2)# Convolution LayerConv2 = ConvolutionLayer(Pool1, weights["W_jk"], biases["b_jk"])# Non-LinearityReLU2 = ReLU(Conv2)# Max Pooling (down-sampling)Pool2 = PoolingLayer(ReLU2, k=2)# Fully connected layer# Reshape conv2 output to fit fully connected layer inputFC = tf.reshape(Pool2, [-1, weights["W_kl"].get_shape().as_list()[0]])FC = tf.add(tf.matmul(FC, weights["W_kl"]), biases["b_kl"])FC = ReLU(FC)# Output, class predictionoutput = tf.add(tf.matmul(FC, weights["W_lm"]), biases["b_lm"])returnoutput# Construct modellogits = ConvolutionalNeuralNetwork(X, weights, biases) prediction = Softmax(logits)# Softamx cross entropy loss functionloss_function = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=logits, labels=Y))# Optimization using the Adam Gradient Descent optimizeroptimizer = tf.train.AdamOptimizer(learning_rate=learning_rate) training_process = optimizer.minimize(loss_function)# Evaluate modelcorrect_pred = tf.equal(tf.argmax(prediction,1), tf.argmax(Y,1)) accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))# recording how the loss functio varies over time during trainingcost = tf.summary.scalar("cost", loss_function)training_accuracy = tf.summary.scalar("accuracy", accuracy)train_summary_op = tf.summary.merge([cost,training_accuracy])train_writer = tf.summary.FileWriter("./Desktop/logs",? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? graph=tf.get_default_graph())# Initialize the variables (i.e. assign their default value)init = tf.global_variables_initializer()# Start trainingwithtf.Session()assess:# Run the initializersess.run(init)start_time = time.time()forstepinrange(1, num_steps+1):? ? ? ? batch_x, batch_y = mnist.train.next_batch(batch_size)# Run optimization op (backprop)sess.run(training_process, feed_dict={X: batch_x, Y: batch_y})ifstep % display_step ==0orstep ==1:# Calculate batch loss and accuracyloss, acc, summary = sess.run([loss_function, accuracy, train_summary_op], feed_dict={X: batch_x,? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Y: batch_y})? ? ? ? train_writer.add_summary(summary, step)? ? ? ? ? ? ? ? print("Step "+ str(step) +", Minibatch Loss= "+ \"{:.4f}".format(loss) +", Training Accuracy= "+ \"{:.3f}".format(acc))? ? ? ? end_time = time.time() print("Time duration: "+ str(int(end_time-start_time)) +" seconds")print("Optimization Finished!")# Calculate accuracy for 256 MNIST test imagesprint("Testing Accuracy:", \? ? sess.run(accuracy, feed_dict={X: mnist.test.images[:256],? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Y: mnist.test.labels[:256]}))

上面的代碼顯得有些冗長,但如果一段一段的對(duì)其進(jìn)行分解仆嗦,讀起來不是很難理解先壕。

運(yùn)行完該程序垃僚,對(duì)應(yīng)結(jié)果應(yīng)如下所示:

Step 1, Minibatch Loss= 74470.4844, Training Accuracy= 0.117

Step 10, Minibatch Loss= 20529.4141, Training Accuracy= 0.250

Step 20, Minibatch Loss= 14074.7539, Training Accuracy= 0.531

Step 30, Minibatch Loss= 7168.9839, Training Accuracy= 0.586

Step 40, Minibatch Loss= 4781.1060, Training Accuracy= 0.703

Step 50, Minibatch Loss= 3281.0979, Training Accuracy= 0.766

Step 60, Minibatch Loss= 2701.2451, Training Accuracy= 0.781

Step 70, Minibatch Loss= 2478.7153, Training Accuracy= 0.773

Step 80, Minibatch Loss= 2312.8320, Training Accuracy= 0.820

Step 90, Minibatch Loss= 2143.0774, Training Accuracy= 0.852

Step 100, Minibatch Loss= 1373.9169, Training Accuracy= 0.852

Step 110, Minibatch Loss= 1852.9535, Training Accuracy= 0.852

Step 120, Minibatch Loss= 1845.3500, Training Accuracy= 0.891

Step 130, Minibatch Loss= 1677.2566, Training Accuracy= 0.844

Step 140, Minibatch Loss= 1683.3661, Training Accuracy= 0.875

Step 150, Minibatch Loss= 1859.3821, Training Accuracy= 0.836

Step 160, Minibatch Loss= 1495.4796, Training Accuracy= 0.859

Step 170, Minibatch Loss= 609.3800, Training Accuracy= 0.914

Step 180, Minibatch Loss= 1376.5054, Training Accuracy= 0.891

Step 190, Minibatch Loss= 1085.0363, Training Accuracy= 0.891

Step 200, Minibatch Loss= 1129.7145, Training Accuracy= 0.914

Step 210, Minibatch Loss= 1488.5452, Training Accuracy= 0.906

Step 220, Minibatch Loss= 584.5027, Training Accuracy= 0.930

Step 230, Minibatch Loss= 619.9744, Training Accuracy= 0.914

Step 240, Minibatch Loss= 1575.8933, Training Accuracy= 0.891

Step 250, Minibatch Loss= 1558.5853, Training Accuracy= 0.891

Step 260, Minibatch Loss= 375.0371, Training Accuracy= 0.922

Step 270, Minibatch Loss= 1568.0758, Training Accuracy= 0.859

Step 280, Minibatch Loss= 1172.9205, Training Accuracy= 0.914

Step 290, Minibatch Loss= 1023.5415, Training Accuracy= 0.914

Step 300, Minibatch Loss= 475.9756, Training Accuracy= 0.945

Step 310, Minibatch Loss= 488.8930, Training Accuracy= 0.961

Step 320, Minibatch Loss= 1105.7720, Training Accuracy= 0.914

Step 330, Minibatch Loss= 1111.8589, Training Accuracy= 0.906

Step 340, Minibatch Loss= 842.7805, Training Accuracy= 0.930

Step 350, Minibatch Loss= 1514.0153, Training Accuracy= 0.914

Step 360, Minibatch Loss= 1722.1812, Training Accuracy= 0.875

Step 370, Minibatch Loss= 681.6041, Training Accuracy= 0.891

Step 380, Minibatch Loss= 902.8599, Training Accuracy= 0.930

Step 390, Minibatch Loss= 714.1541, Training Accuracy= 0.930

Step 400, Minibatch Loss= 1654.8883, Training Accuracy= 0.914

Step 410, Minibatch Loss= 696.6915, Training Accuracy= 0.906

Step 420, Minibatch Loss= 536.7183, Training Accuracy= 0.914

Step 430, Minibatch Loss= 1405.9148, Training Accuracy= 0.891

Step 440, Minibatch Loss= 199.4781, Training Accuracy= 0.953

Step 450, Minibatch Loss= 438.3784, Training Accuracy= 0.938

Step 460, Minibatch Loss= 409.6419, Training Accuracy= 0.969

Step 470, Minibatch Loss= 503.1216, Training Accuracy= 0.930

Step 480, Minibatch Loss= 482.6476, Training Accuracy= 0.922

Step 490, Minibatch Loss= 767.3893, Training Accuracy= 0.922

Step 500, Minibatch Loss= 626.8249, Training Accuracy= 0.930

Time duration: 657 seconds

Optimization Finished!

Testing Accuracy: 0.9453125

綜上,們剛剛完成了第一個(gè)卷積神經(jīng)網(wǎng)絡(luò)的構(gòu)建纫谅,正如在上面的結(jié)果中所看到的那樣付秕,從第一步到最后一步侍郭,模型的準(zhǔn)確性已經(jīng)得到很大的提升亮元,但我們的卷積神經(jīng)網(wǎng)絡(luò)還有較大的改進(jìn)空間爆捞。

現(xiàn)在讓我們?cè)赥ensorboard中可視化構(gòu)建的卷積神經(jīng)網(wǎng)絡(luò)模型:

image

image

結(jié)論:

卷積神經(jīng)網(wǎng)絡(luò)是一個(gè)強(qiáng)大的深度學(xué)習(xí)模型煮甥,應(yīng)用廣泛成肘,性能優(yōu)異。卷積神經(jīng)網(wǎng)絡(luò)的使用只會(huì)隨著數(shù)據(jù)變大和問題變得更加復(fù)雜變得更加具有挑戰(zhàn)性砚偶。

注意:

可以在以下位置找到本文的Jupyter筆記本:

? https://github.com/AegeusZerium/DeepLearning/blob/master/Deep%20Learning/Demystifying%20Convolutional%20Neural%20Networks.ipynb

參考文獻(xiàn):

?? https://en.wikipedia.org/wiki/Convolutional_neural_network

?? https://en.wikipedia.org/wiki/Yann_LeCun

?http://yann.lecun.com/exdb/mnist/

?? https://opensource.com/article/17/11/intro-tensorflow

?? https://en.wikipedia.org/wiki/Tensor

?? http://www.cs.columbia.edu/~mcollins/ff2.pdf

?? https://github.com/tensorflow/tensorboard

?? http://yann.lecun.com/exdb/lenet/

本文作者:【方向】

閱讀原文

本文為云棲社區(qū)原創(chuàng)內(nèi)容风钻,未經(jīng)允許不得轉(zhuǎn)載酒请。

作者:阿里云云棲社區(qū)

鏈接:http://www.reibang.com/p/63792f5b5fca

來源:簡書

簡書著作權(quán)歸作者所有羞反,任何形式的轉(zhuǎn)載都請(qǐng)聯(lián)系作者獲得授權(quán)并注明出處丧慈。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末紊馏,一起剝皮案震驚了整個(gè)濱河市掸驱,隨后出現(xiàn)的幾起案子没佑,更是在濱河造成了極大的恐慌蛤奢,老刑警劉巖啤贩,帶你破解...
    沈念sama閱讀 218,546評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件痹屹,死亡現(xiàn)場離奇詭異,居然都是意外死亡驱犹,警方通過查閱死者的電腦和手機(jī)雄驹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門医舆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蔬将,“玉大人,你說我怎么就攤上這事惫东×冢” “怎么了滞时?”我有些...
    開封第一講書人閱讀 164,911評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵坪稽,是天一觀的道長窒百。 經(jīng)常有香客問我弟孟,道長拂募,這世上最難降的妖魔是什么陈症? 我笑而不...
    開封第一講書人閱讀 58,737評(píng)論 1 294
  • 正文 為了忘掉前任录肯,我火速辦了婚禮论咏,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蠢护。我一直安慰自己葵硕,他們只是感情好懈凹,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評(píng)論 6 392
  • 文/花漫 我一把揭開白布介评。 她就那樣靜靜地躺著威沫,像睡著了一般洼专。 火紅的嫁衣襯著肌膚如雪屁商。 梳的紋絲不亂的頭發(fā)上蜡镶,一...
    開封第一講書人閱讀 51,598評(píng)論 1 305
  • 那天官还,我揣著相機(jī)與錄音望伦,去河邊找鬼。 笑死腿箩,一個(gè)胖子當(dāng)著我的面吹牛珠移,可吹牛的內(nèi)容都是我干的钧惧。 我是一名探鬼主播勾习,決...
    沈念sama閱讀 40,338評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼追逮,長吁一口氣:“原來是場噩夢啊……” “哼钮孵!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起历涝,我...
    開封第一講書人閱讀 39,249評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎漾唉,沒想到半個(gè)月后荧库,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,696評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡赵刑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評(píng)論 3 336
  • 正文 我和宋清朗相戀三年分衫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片般此。...
    茶點(diǎn)故事閱讀 40,013評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖铐懊,靈堂內(nèi)的尸體忽然破棺而出邀桑,到底是詐尸還是另有隱情,我是刑警寧澤科乎,帶...
    沈念sama閱讀 35,731評(píng)論 5 346
  • 正文 年R本政府宣布壁畸,位于F島的核電站,受9級(jí)特大地震影響茅茂,放射性物質(zhì)發(fā)生泄漏捏萍。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評(píng)論 3 330
  • 文/蒙蒙 一玉吁、第九天 我趴在偏房一處隱蔽的房頂上張望照弥。 院中可真熱鬧,春花似錦进副、人聲如沸这揣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽给赞。三九已至,卻和暖如春矫户,著一層夾襖步出監(jiān)牢的瞬間片迅,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評(píng)論 1 270
  • 我被黑心中介騙來泰國打工皆辽, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留柑蛇,地道東北人芥挣。 一個(gè)月前我還...
    沈念sama閱讀 48,203評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像耻台,于是被迫代替她去往敵國和親空免。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容