摘要: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筆記本:
參考文獻(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)并注明出處丧慈。