卷積層的原理和優點
在普通的全連接神經網絡基礎上,加上了卷積層,卷積層可以把低級別的特征逐步提取成為高級別特征的能力,是實現圖像識別、語音識別等人工智能應用的基本原理。所以,由於卷積層這個能自主從原始的數據開始逐步發現特征並最終解決問題的能力,所以卷積層特別適合處理像圖片、視頻、音頻、語音文字等這些相互間位置有一定關系的數據。
卷積神經網絡入門案例-數字圖像識別作為這本書中的一個最簡單的例子,現在根據我個人目前對這個案例的理解,分析下面的知識點。
神經網絡的結構圖是這樣的:
這是一個全連接的神經網絡架構圖,每一個圓圈都是一個神經元,每一條直線表示兩個神經元的連接,並且是層與層之間才有連接,層內的神經元沒有連接,從左到友依次是輸入層(input layer)、第一層隱藏層(hidden layer1)、第二層隱藏層(hidden layer2)、輸出層(output layer).\
輸入層:負責接收和輸入數據
隱藏層:處於輸入層和輸出層之間,隱藏層越多說明這個神經網絡越‘深’。隱藏層超過2個都可以叫深度神經網絡。
輸出層:輸出神經網絡輸出的數據
所謂神經網絡:按照一定的規則連接起來的神經元,而神經網絡結構多種,卷積神經網絡就是其中一種。
卷積神經網絡適用於:圖像識別,語音任務的神經網絡,因為這些神經元之間有密切聯系。
話不多說,理解以上的含義后,用代碼解析一個簡單的卷積神經網絡-數字圖像識別案例。
#導入用到的tensorflow、numpy、os和sys包
import tensorflow as tf import numpy as np import os import sys #保存訓練模型的文件路徑 trainResultPath = './save/check' #初始定義一個命令行變量,是否重新開始訓練模型 ifRestartT = False
#定義一個變量,獲取命令行從第二個參數起所有參數 argt = sys.argv[1:] #循環這個argt變量 for v in argt:
#判斷如果命令行參數有‘restart’,則ifRestartT = True
if v == "-restart": ifRestartT = True #從文件中讀取數據 fileData = np.loadtxt('checkData.txt',dtype=np.float32,delimiter=',') #算出數據集的列數,.size:取出所有數個數 rowSize = int(fileData[0].size) #算出數據集的行數,用數據集所有個數除於列數等於行數 rowCount = int(fileData.size/rowSize) print('rowSize:%d,rowCount:%d'% (rowSize,rowCount)) #定義x變量為5x5矩陣 x = tf.placeholder(shape=[1,5,5,1],dtype=tf.float32) yTrain = tf.placeholder(shape=[3],dtype=tf.float32) #定義卷積核對象為可變對象,用於和圖片進行卷積運算 filterT = tf.Variable(tf.random_normal([2,2,1,1])) #nn.conv2d:卷積運算,參數依次是(輸入數據,卷積核,步長,是否填充0) y1 = tf.nn.conv2d(x,filterT,strides=[1,1,1,1],padding='VALID')
#將y1矩陣數據拉直為一行數據,用於下面全連接的輸入數據 yF = tf.reshape(y1,[1,-1]) #定義全連接w1權值.形態為[25,64] w1 =tf.Variable(tf.random_normal([yF.get_shape().as_list()[1],64],mean=0.5,stddev=0.1,dtype=tf.float32))
#定義b1值 b1 = tf.Variable(0,dtype=tf.float32)
#定義y2層,進行矩陣運算並加入激活函數tanh y2 = tf.nn.tanh(tf.matmul(yF,w1)+b1) #定義全連接wn權值,形態為[64,3],選擇列數為3,因為輸出的值有三個類型 wn =tf.Variable(tf.random_normal([64,3],mean=0.5,stddev=0.1,dtype=tf.float32))
#定義bn值 bn = tf.Variable(0,dtype=tf.float32) #定義mn層,進行矩陣運算 mn = tf.matmul(y2,wn) +bn
#控制mn值相加為1,概率合為1 yn = tf.nn.softmax(mn)
#將yn拉直為一行數據 yResult = tf.reshape(yn,[-1]) #計算損失值 loss = -tf.reduce_mean(yTrain*tf.log(tf.clip_by_value(yResult,1e-10,1.0))) #給定學習率 optimizer = tf.train.RMSPropOptimizer(0.01) # train = optimizer.minimize(loss) #定義一個調用tf.Session()的對象 sess = tf.Session() #sess.run(tf.global_variables_initializer()) if ifRestartT: print("force restart...") sess.run(tf.global_variables_initializer()) elif os.path.exists(trainResultPath + ".index"): print("loading: %s" % trainResultPath) tf.train.Saver().restore(sess, save_path=trainResultPath) else: print("train result path not exists: %s" % trainResultPath) sess.run(tf.global_variables_initializer()) for i in range(100): totalLoss = 0.0 for j in range(rowCount): result = sess.run([train,yResult,yTrain,loss],feed_dict={x:np.reshape(fileData[j][0:25],(1,5,5,1)),yTrain:fileData[j][25:28]}) print(result) totalLoss = totalLoss+ float(result[len(result)-1]) print('avgLoss:%10.10f'% (totalLoss/rowCount)) #保存訓練過程文件 #trainResultPath = './save/check' print("saving...") tf.train.Saver().save(sess, save_path=trainResultPath) writer = tf.summary.FileWriter('graph',sess.graph)