卷積神經網路訓練
阿新 • • 發佈:2021-01-15
技術標籤:深度學習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區域的最強輸入。