成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

深入淺出解讀卷積神經網絡

人工智能 深度學習
卷積神經網絡和全連接的神經網絡結構上的差異還是比較大的,全連接的網絡,相鄰兩層的節點都有邊相連,而卷積神經網絡,相鄰節點只有部分節點相連。

卷積神經網絡 

經網絡結構圖

圖2 卷積神經網絡結構圖

卷積神經網絡和全連接的神經網絡結構上的差異還是比較大的,全連接的網絡,相鄰兩層的節點都有邊相連,而卷積神經網絡,相鄰節點只有部分節點相連。

全連接神經網絡處理圖像的***問題在于全連接層的參數太多,參數太多的話容易發生過擬合而且會導致計算速度減慢,卷積神經網絡可以減小參數個數的目的。

假設輸入是一張圖片大小為28*28*3,***層隱藏層有500個節點,那么***層的參數就有28*28*3*500+500=1176000個參數,當圖片更大時,參數就更多了,而且這只是***層。

那么為什么卷積神經網絡可以達到減小參數的目的呢?

卷積神經網絡最為關鍵的有卷積層,池化層,全連接層。

卷積層

卷積層中每個節點的輸入只是上一層神經網絡的一小塊,通常由卷積核來實現,卷積核是一個過濾器,可以想象成一個掃描窗口,扣到每張圖片上,然后根據設置好的大小步長等等掃描圖片,計算規則是被扣的圖像像素矩陣跟卷積核的權重對應位置相乘然后求和,每掃描一次得到一個輸出。卷積層所做的工作可以理解為對圖像像素的每一小塊進行特征抽象。可以通過多個不同的卷積核對同一張圖片進行卷積,卷積核的個數,其實就是卷積之后輸出矩陣的深度。卷積神經網絡的參數個數與圖片大小無關,只跟過濾器的尺寸、深度以及卷積核的個數(輸出矩陣的深度)有關。假設是還是28*28*3的圖片,卷積核的大小設為3*3*3,輸出矩陣的深度為500,那么參數個數為3*3*3*500+500=14000個參數,對比全連接層,參數減少了很多。

 圖3 形象的卷積層示例

池化層

池化層可以認為是將一張高分辨率的圖片轉化為低分辨率的圖片。可以非常有效的縮小矩陣的尺寸,從而減小全連接層的參數個數,這樣可以加快計算速率同時又防止過擬合,池化,可以減小模型,提高速度,同時提高所提取特征的魯棒性。

使用2*2的過濾器步長為2,***池化如下圖所示:

 

圖4 2*2過濾器***池化示例圖

我們可以將卷積層和池化層看成是自動特征提取就可以了。

通過上面直觀的介紹,現在我們就知道為什么卷積神經網絡可以達到減小參數的目的了?

和全連接神經網絡相比,卷積神經網絡的優勢在于共享權重和稀疏連接。共享權重在于參數只與過濾器有關。卷積神經網絡減少參數的另外一個原因是稀疏連接。輸出節點至于輸入圖片矩陣的部分像素矩陣有關,也就是跟卷積核扣上去的那一小塊矩陣有關。這就是稀疏連接的概念。

卷積神經網絡通過權重共享和稀疏連接來減少參數的。從而防止過度擬合。

訓練過程

卷積神經網絡的訓練過程大致可分為如下幾步:

***步:導入相關庫、加載參數 

  1. import math 
  2. import numpy as np 
  3. import tensorflow as tf 
  4. import matplotlib.pyplot as plt 
  5. import h5py 
  6. from tensorflow.python.framework import ops 
  7. from tf_utils import * 
  8. np.random.seed(1) 
  9. X_train_orig,Y_train_orig,X_test_orig,Y_test_orig,classes=load_dataset() 
  10. index=0 
  11. plt.imshow(X_train_orig[index]) 
  12. print("y="+str(np.squeeze(Y_train_orig[:,index]))) 
  13. plt.show() 

第二步:歸一化,有利于加快梯度下降

  1. X_train=X_train_orig/255.0 
  2. X_test=X_test_orig/255.0 
  3. Y_train=convert_to_one_hot(Y_train_orig,6) 
  4. Y_test=convert_to_one_hot(Y_test_orig,6) 

第三步:定義參數及卷積神經網絡結構

  1. def create_placeholder(num_px,channel,n_y): 
  2.     X=tf.placeholder(tf.float32,shape=(None,num_px,num_px,channel),name='X'
  3.     Y=tf.placeholder(tf.float32,shape=(None,n_y),name='Y'
  4.     return X,Y 
  5. X,Y=create_placeholder(64,3,6) 
  6. print("X="+str(X)) 
  7. print("Y="+str(Y)) 
  8.  
  9. def weight_variable(shape): 
  10.     return tf.Variable(tf.truncated_normal(shape,stddev=0.1)) 
  11. def bias_variable(shape): 
  12.     return tf.Variable(tf.constant(0.1,shape=shape)) 
  13. def conv2d(x,W): 
  14.     return tf.nn.conv2d(x,W,strides=[1,1,1,1],padding='SAME'
  15. def max_pool_2x2(x): 
  16.     return tf.nn.max_pool(x,ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME'
  17.  
  18. def initialize_parameters(): 
  19.     w_conv1=weight_variable([5,5,3,32]) 
  20.     b_conv1=bias_variable([32]) 
  21.      
  22.     w_conv2=weight_variable([5,5,32,64]) 
  23.     b_conv2=bias_variable([64]) 
  24.      
  25.     w_fc1=weight_variable([16*16*64,512]) 
  26.     b_fc1=bias_variable([512]) 
  27.      
  28.     w_fc2=weight_variable([512,6]) 
  29.     b_fc2=bias_variable([6]) 
  30.      
  31.     parameters={ 
  32.         "w_conv1":w_conv1, 
  33.         "b_conv1":b_conv1, 
  34.         "w_conv2":w_conv2, 
  35.         "b_conv2":b_conv2, 
  36.         "w_fc1":w_fc1, 
  37.         "b_fc1":b_fc1, 
  38.         "w_fc2":w_fc2, 
  39.         "b_fc2":b_fc2 
  40.     } 
  41.     return parameters 

第四步:前行傳播過程

  1. def forward_propagation(X,parameters): 
  2.     w_conv1=parameters["w_conv1"
  3.     b_conv1=parameters["b_conv1"
  4.     h_conv1=tf.nn.relu(conv2d(X,w_conv1)+b_conv1) 
  5.     h_pool1=max_pool_2x2(h_conv1) 
  6.      
  7.     w_conv2=parameters["w_conv2"
  8.     b_conv2=parameters["b_conv2"
  9.     h_conv2=tf.nn.relu(conv2d(h_pool1,w_conv2)+b_conv2) 
  10.     h_pool2=max_pool_2x2(h_conv2) 
  11.      
  12.     w_fc1=parameters["w_fc1"
  13.     b_fc1=parameters["b_fc1"
  14.     h_pool2_flat=tf.reshape(h_pool2,[-1,16*16*64]) 
  15.     h_fc1=tf.nn.relu(tf.matmul(h_pool2_flat,w_fc1)+b_fc1) 
  16.      
  17.     #keep_prob=tf.placeholder(tf.float32) 
  18.     #h_fc1_drop=tf.nn.dropout(h_fc1,keep_prob) 
  19.      
  20.     w_fc2=parameters["w_fc2"
  21.     b_fc2=parameters["b_fc2"
  22.     y_conv=tf.matmul(h_fc1,w_fc2)+b_fc2 
  23.     return y_conv 

第五步:成本函數

  1. def compute_cost(y_conv,Y): 
  2.  
  3.     cost=tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=y_conv,labels=Y)) 
  4.     return cost 

第六步:梯度下降更新參數

  1. def random_mini_batches1(X, Y, mini_batch_size = 64, seed = 0): 
  2.     m = X.shape[0]                  # number of training examples 
  3.     mini_batches = [] 
  4.     np.random.seed(seed) 
  5.     Y=Y.T         #(1080,6) 
  6.     # Step 1: Shuffle (X, Y) 
  7.     permutation = list(np.random.permutation(m)) 
  8.     shuffled_X = X[permutation,:,:,:] 
  9.     shuffled_Y = Y[permutation,:].reshape((m,Y.shape[1])) 
  10.  
  11.     # Step 2: Partition (shuffled_X, shuffled_Y). Minus the end case
  12.     num_complete_minibatches = math.floor(m/mini_batch_size) # number of mini batches of size mini_batch_size in your partitionning 
  13.     for k in range(0, num_complete_minibatches): 
  14.         mini_batch_X = shuffled_X[k * mini_batch_size : k * mini_batch_size + mini_batch_size,:,:,:] 
  15.         mini_batch_Y = shuffled_Y[k * mini_batch_size : k * mini_batch_size + mini_batch_size,:] 
  16.         mini_batch = (mini_batch_X, mini_batch_Y) 
  17.         mini_batches.append(mini_batch) 
  18.      
  19.     # Handling the end case (last mini-batch < mini_batch_size) 
  20.     if m % mini_batch_size != 0: 
  21.         mini_batch_X = shuffled_X[num_complete_minibatches * mini_batch_size : m,:,:,:] 
  22.         mini_batch_Y = shuffled_Y[num_complete_minibatches * mini_batch_size : m,:] 
  23.         mini_batch = (mini_batch_X, mini_batch_Y) 
  24.         mini_batches.append(mini_batch) 
  25.      
  26.     return mini_batches 

第七步:訓練模型

  1.  def model(X_train,Y_train,X_test,Y_test,learning_rate=0.001,num_epochs=20,minibatch_size=32,print_cost=True):    
  2. ops.reset_default_graph()  #(1080, 64, 64, 3) 
  3.     tf.set_random_seed(1)      #Y_train(6, 1080) 
  4.     seed=3 
  5.     (m,num_px1,num_px2,c)=X_train.shape 
  6.     n_y=Y_train.shape[0] 
  7.     costs=[] 
  8.     X,Y=create_placeholder(64,3,6) 
  9.     parameters=initialize_parameters() 
  10.      
  11.     Z3=forward_propagation(X,parameters) 
  12.     cost=compute_cost(Z3,Y) 
  13.     optm=tf.train.AdamOptimizer(learning_rate).minimize(cost) 
  14.      
  15.     correct_prediction=tf.equal(tf.argmax(Z3,1),tf.argmax(Y,1))#居然忘記1了,所以一直出現損失越來越小了,但是準確率卻一直是0 
  16.     accuracy=tf.reduce_mean(tf.cast(correct_prediction,tf.float32)) 
  17.     with tf.Session() as sess: 
  18.         tf.global_variables_initializer().run() 
  19.         for epoch in range(num_epochs): 
  20.             epoch_cost=0 
  21.             num_minibatches=int(m/minibatch_size) 
  22.             seed+=1 
  23.             #下面輸入要求(6,,1080)格式,所以要加個轉置 
  24.             minibatches=random_mini_batches1(X_train,Y_train,minibatch_size,seed) 
  25.              
  26.             for minibatch in minibatches: 
  27.                 (minibatch_X,minibatch_Y)=minibatch 
  28.                 _,minibatch_cost=sess.run([optm,cost],feed_dict={X:minibatch_X,Y:minibatch_Y}) 
  29.                 epoch_cost+=minibatch_cost/num_minibatches 
  30.             if(print_cost==True and epoch % 2==0): 
  31.                 #print("Epoch",'%04d' % (epoch+1),"cost={:.9f}".format(epoch_cost)) 
  32.                 print("Cost after epoch %i:%f" % (epoch,epoch_cost)) 
  33.             if(print_cost==True and epoch %1==0): 
  34.                 costs.append(epoch_cost) 
  35.                  
  36.         print("Train Accuracy:",accuracy.eval({X:X_train,Y:Y_train.T})) 
  37.         print("Test Accuracy:",accuracy.eval({X:X_test,Y:Y_test.T})) 
  38.         plt.plot(np.squeeze(costs)) 
  39.         plt.ylabel('cost'
  40.         plt.xlabel('iterations(per tens)'
  41.         plt.title("learning rate="+str(learning_rate)) 
  42.         plt.show() 
  43.          
  44.         parameters=sess.run(parameters) 
  45.         return parameters 
  46. parameters=model(X_train,Y_train,X_test,Y_test)  
責任編輯:龐桂玉 來源: 機器學習算法全棧工程師
相關推薦

2021-03-16 08:54:35

AQSAbstractQueJava

2011-07-04 10:39:57

Web

2019-02-13 16:22:53

網絡虛擬化大二層

2019-01-07 15:29:07

HadoopYarn架構調度器

2017-07-02 18:04:53

塊加密算法AES算法

2012-05-21 10:06:26

FrameworkCocoa

2021-07-20 15:20:02

FlatBuffers阿里云Java

2022-09-26 09:01:15

語言數據JavaScript

2009-11-30 16:46:29

學習Linux

2012-02-21 13:55:45

JavaScript

2022-01-11 07:52:22

CSS 技巧代碼重構

2018-11-09 16:24:25

物聯網云計算云系統

2019-11-11 14:51:19

Java數據結構Properties

2022-11-09 08:06:15

GreatSQLMGR模式

2022-12-02 09:13:28

SeataAT模式

2022-10-31 09:00:24

Promise數組參數

2019-12-04 10:13:58

Kubernetes存儲Docker

2009-11-18 13:30:37

Oracle Sequ

2021-04-27 08:54:43

ConcurrentH數據結構JDK8

2025-03-27 09:38:35

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲欧美中文字幕 | 永久av| 色香婷婷 | 国产精品福利在线观看 | 国产ts人妖一区二区三区 | 日韩中文一区二区三区 | av在线免费观看网站 | 国产成人精品一区二区三区四区 | 香蕉一区 | 国产精品国产亚洲精品看不卡15 | av色噜噜 | 国产精彩视频在线观看 | 国产高清在线观看 | 欧美狠狠操 | 美女131mm久久爽爽免费 | 91精品国产一区二区三区香蕉 | 成人三级在线观看 | 亚洲一区不卡在线 | 99热热热热| 一区二区三区视频在线 | 日韩在线视频精品 | 男人久久天堂 | 视频一区在线 | 午夜欧美| 日本不卡在线观看 | 成人欧美一区二区三区黑人孕妇 | 亚洲精选一区 | 国产精品a久久久久 | 久久久久久中文字幕 | 日本不卡一区 | 欧美1区2区 | 亚洲一级黄色 | 91视频在线看 | 成人不卡 | 性生活毛片 | 在线免费小视频 | 久久精品国产亚洲一区二区 | 欧美在线资源 | 国产成人精品福利 | 国产精品国产 | 精精久久|