97视频在线观看免费高清完整版在线观看-69精品人人人人-爱的色放3-亚洲黄色一区-亚洲精品视频免费在线观看-男人天堂免费视频-久久久社区-日韩综合一区二区-色撸撸在线-蝌蚪av-国产乱淫视频-男生尿隔着内裤呲出来视频-人操人操-欧美鲁鲁-免费视频99-3级av-中国一级大黄大黄大色毛片-久久久欧美精品-99精品在线看-色峰视频-印度毛茸茸-国产福利毛片-国产极品999-69日韩-天天综合网国产

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

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

新的算法理論不斷涌現(xiàn)的同時,各種深度學(xué)習(xí)框架也不斷出現(xiàn)在人們視野,比如Torch,Caffe等等。TensorFlow是Google開發(fā)的第二代機器學(xué)習(xí)系統(tǒng),于2015年底開源,成為了新一代流行的機器學(xué)習(xí)的算法框架。這一章節(jié)我們將tensorFlow怎么實現(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ò)是基于感知機的擴展,而DNN可以理解為有很多隱藏層的神經(jīng)網(wǎng)絡(luò)。多層神經(jīng)網(wǎng)絡(luò)和深度神經(jīng)網(wǎng)絡(luò)DNN其實也是指的一個東西,DNN有時也叫做多層感知機(Multi-Layer perceptron,MLP)。
從DNN按不同層的位置劃分,DNN內(nèi)部的神經(jīng)網(wǎng)絡(luò)層可以分為三類,輸入層,隱藏層和輸出層,如下圖示例,一般來說第一層是輸入層,最后一層是輸出層,而中間的層數(shù)都是隱藏層。
TensorFlow65
層與層之間是全連接的,也就是說,第i層的任意一個神經(jīng)元一定與第i+1層的任意一個神經(jīng)元相連。雖然DNN看起來很復(fù)雜,但是從小的局部模型來說,還是和感知機一樣,即一個線性關(guān)系Z=Wi*Xi+B加上一個激活函數(shù)。DNN的參數(shù)定義:
TensorFlow66
TensorFlow67
DNN前向傳播算法數(shù)學(xué)原理
假設(shè)選擇的激活函數(shù)是sigma(z),隱藏層和輸出層的輸出值為a,則對于下圖的三層DNN,利用和感知機一樣的思路,我們可以利用上一層的輸出計算下一層的輸出,也就是所謂的DNN前向傳播算法。
TensorFlow68
TensorFlow69
上面可以看出,使用代數(shù)法一個個的表示輸出比較復(fù)雜,而如果使用矩陣法則比較的簡潔。假設(shè)第l−1層共有m個神經(jīng)元,而第l層共有n個神經(jīng)元,則第l層的線性系數(shù)w組成了一個n×m的矩陣W。第l層的偏倚b組成了一個n的向量b ,第l-1層的輸出a組成了一個m的向量a,第l層的未激活前線性輸出z組成了一個 n的向量z ,第l層的輸出a組成了一個n的向量a。用矩陣法表示,第l層的輸出為:
TensorFlow70
DNN前向傳播算法
所謂的DNN前向傳播算法就是利用若干個權(quán)重系數(shù)矩陣W,偏倚向量b來和輸入值向量x進行一系列線性運算和激活運算,從輸入層開始,一層層的向后計算,一直到運算到輸出層,得到輸出結(jié)果為值。
輸入: 總層數(shù)L,所有隱藏層和輸出層對應(yīng)的矩陣W,偏倚向量b,輸入值向量x
輸出:輸出層的輸出。
TensorFlow71
DNN反向傳播算法
在進行DNN反向傳播算法前,我們需要選擇一個損失函數(shù),來度量訓(xùn)練樣本計算出的輸出和真實的訓(xùn)練樣本輸出之間的損失。DNN可選擇的損失函數(shù)有不少,為了專注算法,這里使用最常見的均方差來度量損失。即對于每個樣本,我們期望最小化下式:
TensorFlow72
損失函數(shù)有了,用梯度下降法迭代求解每一層的w,b。
首先是輸出層第 L 層。注意到輸出層的W,b滿足下式:
TensorFlow73
對于輸出層的參數(shù),損失函數(shù)變?yōu)椋?br />
TensorFlow74
求解W,b的梯度:
TensorFlow75
TensorFlow76
TensorFlow77
由于梯度下降法有批量(Batch),小批量(mini-Batch),隨機三個變種,為了簡化描述,這里我們以最基本的批量梯度下降法為例來描述反向傳播算法。實際上在業(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)尊重與保護知識產(chǎn)權(quán)。如發(fā)現(xiàn)本站文章存在版權(quán)等問題,煩請30天內(nèi)提供版權(quán)疑問、身份證明、版權(quán)證明、聯(lián)系方式等發(fā)郵件至1851688011@qq.com我們將及時溝通與處理。?。?a href="/">首頁 > 新聞 » DNN深度神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)與實現(xiàn)

()
分享到:

相關(guān)推薦

留言與評論(共有 0 條評論)
   
驗證碼: