1. 程式人生 > 其它 >卷積神經網路訓練

卷積神經網路訓練

技術標籤:深度學習tensorflow機器學習

神經網路

輸入層(Input layer):眾多神經元(Neuron)接受大量非線形輸入資訊。輸入的資訊稱為輸入向量。
輸出層(Output layer):資訊在神經元連結中傳輸、分析、權衡,形成輸出結果。輸出的訊息稱為輸出向量。
隱藏層(Hidden layer):簡稱“隱層”,是輸入層和輸出層之間眾多神經元和連結組成的各個層面。如果有多個隱藏層,則意味著多個啟用函式。

前向傳播

用深度學習實現銀行卡號識別

前向傳播過程中,輸入的圖形資料經過多層卷積層的卷積和池化處理,提出特徵向量,將特徵向量傳入全連線層中,得出分類識別的結果。
神經網路模型


在這裡插入圖片描述

反向傳播

當卷積神經網路輸出的結果與我們的期望值不相符時,則進行反向傳播過程。

求出結果與期望值的誤差,再將誤差一層一層的返回,計算出每一層的誤差,然後進行權值更新。該過程的主要目的是通過訓練樣本和期望值來調整網路權值。

誤差的傳遞過程可以這樣來理解,首先,資料從輸入層到輸出層,期間經過了卷積層,下采樣層,全連線層,而資料在各層之間傳遞的過程中難免會造成資料的損失,則也就導致了誤差的產生。

下面是我在銀行卡號識別中的部分程式碼

def backward(data, label):

    x = tf.placeholder(tf.float32, shape = (None, forward.INPUT_NODE))
y_ = tf.placeholder(tf.float32, shape = (None, forward.OUTPUT_NODE)) y = forward.forward(x, REGULARIZER) global_step = tf.Variable(0, trainable=False) ce = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=y, labels=tf.argmax(y_, 1)) cem = tf.reduce_mean(ce) loss = cem + tf.add_n(
tf.get_collection('losses')) train_step = tf.train.GradientDescentOptimizer(0.001).minimize(loss, global_step=global_step) ema = tf.train.ExponentialMovingAverage(MOVING_AVERAGE_DECAY, global_step) ema_op = ema.apply(tf.trainable_variables()) with tf.control_dependencies([train_step, ema_op]): train_op = tf.no_op(name='train') saver = tf.train.Saver() with tf.Session() as sess: init_op = tf.global_variables_initializer() sess.run(init_op) ckpt = tf.train.get_checkpoint_state(MODEL_SAVE_PATH) if ckpt and ckpt.model_checkpoint_path: saver.restore(sess, ckpt.model_checkpoint_path) for i in range(STEPS): start = (i*BATCH_SIZE)%len(data) end = start+BATCH_SIZE _, loss_value, step = sess.run([train_op, loss, global_step], feed_dict={x: data[start:end], y_: label[start:end]}) if i % 100 == 0: print("After %d training step(s), loss on training batch is %g." % (step, loss_value)) saver.save(sess, os.path.join(MODEL_SAVE_PATH, MODEL_NAME), global_step=global_step) def main(): data, label = IMG.img_handle() for i in range(len(data)): x, y = random.randint(0, len(data)-1), random.randint(0, len(data)-1) temp_data = data[x] data[x] = data[y] data[y] = temp_data temp_label = label[x] label[x] = label[y] label[y] = temp_label print(len(data), len(label)) backward(data, label)

卷積層的權值更新

卷積層的誤差更新過程為:將誤差矩陣當做卷積核,卷積輸入的特徵圖,並得到了權值的偏差矩陣,然後與原先的卷積核的權值相加,並得到了更新後的卷積核。
全連線層的權值更新過程

全連線層中的權值更新過程為:

1、求出權值的偏導數值:學習速率乘以激勵函式的倒數乘以輸入值;
2、原先的權值加上偏導值,得到新的權值矩陣。具體的過程如圖4-9所示(圖中的啟用函式為Sigmoid函式)

取樣方法:

子取樣有兩種形式,一種是均值子取樣(mean-pooling),一種是最大值子取樣(max-pooling)。

 (1)均值子取樣的卷積核中每個權重都是0.25,卷積核在原圖inputX上的滑動的步長為2。均值子取樣的效果相當於把原圖模糊縮減至原來的1/4。

   (2)最大值子取樣的卷積核中各權重值中只有一個為1,其餘均為0,卷積核中為1的位置對應inputX被卷積核覆蓋部分值最大的位置。卷積核在原圖inputX上的滑動步長為2。最大值子取樣的效果是把原圖縮減至原來的1/4,並保留每個2*2區域的最強輸入。