99热综合福利导航,久久66日韩,91一二区少妇,久久产国视频,日韩久久久五月精品八区,丰满狐狸精在线电影,一区婷婷久久,日韩欧美另类在线,欧美中文字幕区

星空人工智能技術(shù)網(wǎng)

DNN深度神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)與實(shí)現(xiàn)

新的算法理論不斷涌現(xiàn)的同時(shí),各種深度學(xué)習(xí)框架也不斷出現(xiàn)在人們視野,比如Torch,Caffe等等。TensorFlow是Google開發(fā)的第二代機(jī)器學(xué)習(xí)系統(tǒng),于2015年底開源,成為了新一代流行的機(jī)器學(xué)習(xí)的算法框架。這一章節(jié)我們將tensorFlow怎么實(shí)現(xiàn)深度神經(jīng)網(wǎng)絡(luò)(DNN)。深度神經(jīng)網(wǎng)絡(luò)(DNNs)是擁有多層感知器的架構(gòu),用來解決復(fù)雜的學(xué)習(xí)問題。

DNN的基本結(jié)構(gòu)
神經(jīng)網(wǎng)絡(luò)是基于感知機(jī)的擴(kuò)展,而DNN可以理解為有很多隱藏層的神經(jīng)網(wǎng)絡(luò)。多層神經(jīng)網(wǎng)絡(luò)和深度神經(jīng)網(wǎng)絡(luò)DNN其實(shí)也是指的一個(gè)東西,DNN有時(shí)也叫做多層感知機(jī)(Multi-Layer perceptron,MLP)。
從DNN按不同層的位置劃分,DNN內(nèi)部的神經(jīng)網(wǎng)絡(luò)層可以分為三類,輸入層,隱藏層和輸出層,如下圖示例,一般來說第一層是輸入層,最后一層是輸出層,而中間的層數(shù)都是隱藏層。
TensorFlow65
層與層之間是全連接的,也就是說,第i層的任意一個(gè)神經(jīng)元一定與第i+1層的任意一個(gè)神經(jīng)元相連。雖然DNN看起來很復(fù)雜,但是從小的局部模型來說,還是和感知機(jī)一樣,即一個(gè)線性關(guān)系Z=Wi*Xi+B加上一個(gè)激活函數(shù)。DNN的參數(shù)定義:
TensorFlow66
TensorFlow67
DNN前向傳播算法數(shù)學(xué)原理
假設(shè)選擇的激活函數(shù)是sigma(z),隱藏層和輸出層的輸出值為a,則對于下圖的三層DNN,利用和感知機(jī)一樣的思路,我們可以利用上一層的輸出計(jì)算下一層的輸出,也就是所謂的DNN前向傳播算法。
TensorFlow68
TensorFlow69
上面可以看出,使用代數(shù)法一個(gè)個(gè)的表示輸出比較復(fù)雜,而如果使用矩陣法則比較的簡潔。假設(shè)第l−1層共有m個(gè)神經(jīng)元,而第l層共有n個(gè)神經(jīng)元,則第l層的線性系數(shù)w組成了一個(gè)n×m的矩陣W。第l層的偏倚b組成了一個(gè)n的向量b ,第l-1層的輸出a組成了一個(gè)m的向量a,第l層的未激活前線性輸出z組成了一個(gè) n的向量z ,第l層的輸出a組成了一個(gè)n的向量a。用矩陣法表示,第l層的輸出為:
TensorFlow70
DNN前向傳播算法
所謂的DNN前向傳播算法就是利用若干個(gè)權(quán)重系數(shù)矩陣W,偏倚向量b來和輸入值向量x進(jìn)行一系列線性運(yùn)算和激活運(yùn)算,從輸入層開始,一層層的向后計(jì)算,一直到運(yùn)算到輸出層,得到輸出結(jié)果為值。
輸入: 總層數(shù)L,所有隱藏層和輸出層對應(yīng)的矩陣W,偏倚向量b,輸入值向量x
輸出:輸出層的輸出。
TensorFlow71
DNN反向傳播算法
在進(jìn)行DNN反向傳播算法前,我們需要選擇一個(gè)損失函數(shù),來度量訓(xùn)練樣本計(jì)算出的輸出和真實(shí)的訓(xùn)練樣本輸出之間的損失。DNN可選擇的損失函數(shù)有不少,為了專注算法,這里使用最常見的均方差來度量損失。即對于每個(gè)樣本,我們期望最小化下式:
TensorFlow72
損失函數(shù)有了,用梯度下降法迭代求解每一層的w,b。
首先是輸出層第 L 層。注意到輸出層的W,b滿足下式:
TensorFlow73
對于輸出層的參數(shù),損失函數(shù)變?yōu)椋?br />
TensorFlow74
求解W,b的梯度:
TensorFlow75
TensorFlow76
TensorFlow77
由于梯度下降法有批量(Batch),小批量(mini-Batch),隨機(jī)三個(gè)變種,為了簡化描述,這里我們以最基本的批量梯度下降法為例來描述反向傳播算法。實(shí)際上在業(yè)界使用最多的是mini-Batch的梯度下降法。
TensorFlow78
DNN代碼
import input_data
mnist = input_data.read_data_sets("/tmp/data/", one_hot=True)

import tensorflow as tf

# Parameters
learning_rate = 0.001
training_iters = 200000
batch_size = 64
display_step = 20

# Network Parameters
n_input = 784 # MNIST data input (img shape: 28*28)
n_classes = 10 # MNIST total classes (0-9 digits)
dropout = 0.8 # Dropout, probability to keep units

# tf Graph input
x = tf.placeholder(tf.float32, [None, n_input])
y = tf.placeholder(tf.float32, [None, n_classes])
keep_prob = tf.placeholder(tf.float32) # dropout (keep probability)
def init_weights(shape):
    return tf.Variable(tf.random_normal(shape, stddev=0.01))
# Create custom model
def conv2d(name, l_input, w, b):
    return tf.nn.relu(tf.nn.bias_add(tf.nn.conv2d(l_input, w, strides=[1, 1, 1, 1], padding='SAME'),b), name=name)

def max_pool(name, l_input, k):
    return tf.nn.max_pool(l_input, ksize=[1, k, k, 1], strides=[1, k, k, 1], padding='SAME', name=name)

def norm(name, l_input, lsize=4):
    return tf.nn.lrn(l_input, lsize, bias=1.0, alpha=0.001 / 9.0, beta=0.75, name=name)

def dnn(_X, _weights, _biases, _dropout):
    # Reshape input picture



    _X = tf.nn.dropout(_X, _dropout)#//這里可以讓dropout都不同 我就一樣了
    d1 = tf.nn.relu(tf.nn.bias_add(tf.matmul(_X,_weights['wd1']),_biases['bd1']), name="d1")

    d2x = tf.nn.dropout(d1, _dropout)
    d2 =  tf.nn.relu(tf.nn.bias_add(tf.matmul(d2x,_weights['wd2']),_biases['bd2']), name="d2")

    #dense1 = tf.nn.relu(tf.matmul(dense1, _weights['wd1']) + _biases['bd1'], name='fc1') # Relu activation

    #dense2 = tf.nn.relu(tf.matmul(dense1, _weights['wd2']) + _biases['bd2'], name='fc2') # Relu activation
    dout =tf.nn.dropout(d2,_dropout)
    # Output, class prediction
    out = tf.matmul(dout, _weights['out']) + _biases['out']
    return out

# Store layers weight & bias
weights = {
    'wd1': tf.Variable(tf.random_normal([784,600], stddev=0.01)),
    'wd2': tf.Variable(tf.random_normal([600,480], stddev=0.01)),
    'out': tf.Variable(tf.random_normal([480, 10]))
}
biases = {
    'bd1': tf.Variable(tf.random_normal([600])),
    'bd2': tf.Variable(tf.random_normal([480])),
    'out': tf.Variable(tf.random_normal([10])),
}

# Construct model
pred = dnn(x, weights, biases, keep_prob)

# Define loss and optimizer
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(pred, y))
optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cost)

# Evaluate model
correct_pred = tf.equal(tf.argmax(pred,1), tf.argmax(y,1))
accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))

# Initializing the variables
init = tf.initialize_all_variables()

# Launch the graph
with tf.Session() as sess:
    sess.run(init)

    step = 1
    # Keep training until reach max iterations
    while step * batch_size < training_iters:
        batch_xs, batch_ys = mnist.train.next_batch(batch_size)
        # Fit training using batch data
        sess.run(optimizer, feed_dict={x: batch_xs, y: batch_ys, keep_prob: dropout})
        if step % display_step == 0:
            # Calculate batch accuracy
            acc = sess.run(accuracy, feed_dict={x: batch_xs, y: batch_ys, keep_prob: 1.})
            # Calculate batch loss
            loss = sess.run(cost, feed_dict={x: batch_xs, y: batch_ys, keep_prob: 1.})
            print "Iter " + str(step*batch_size) + ", Minibatch Loss= " + "{:.6f}".format(loss) + ", Training Accuracy= " + "{:.5f}".format(acc)

        step += 1
    print "Optimization Finished!"
    # Calculate accuracy for 256 mnist test images
    print "Testing Accuracy:", sess.run(accuracy, feed_dict={x: mnist.test.images[:256], y: mnist.test.labels[:256], keep_prob: 1.})

星空人工智能技術(shù)網(wǎng) 倡導(dǎo)尊重與保護(hù)知識產(chǎn)權(quán)。如發(fā)現(xiàn)本站文章存在版權(quán)等問題,煩請30天內(nèi)提供版權(quán)疑問、身份證明、版權(quán)證明、聯(lián)系方式等發(fā)郵件至1851688011@qq.com我們將及時(shí)溝通與處理。?。?a href="/">首頁 > 新聞 » DNN深度神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)與實(shí)現(xiàn)

()
分享到:

相關(guān)推薦

留言與評論(共有 0 條評論)
   
驗(yàn)證碼:
喀什市| 铜陵市| 漯河市| 山西省| 海兴县| 科技| 特克斯县| 邯郸县| 台南县| 龙里县| 阿拉善右旗| 团风县| 达尔| 潞城市| 大洼县| 中宁县| 张家界市| 平定县| 德阳市| 塔城市| 平塘县| 子长县| 杭锦后旗| 平江县| 当涂县| 集安市| 庄河市| 错那县| 乾安县| 屏东市| 兴隆县| 丹江口市| 丹寨县| 三穗县| 新河县| 定兴县| 印江| 静海县| 翼城县| 澳门| 特克斯县|