成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

一個(gè)單層的基礎(chǔ)神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)手寫(xiě)字識(shí)別

cyrils / 533人閱讀

摘要:以下是我上次寫(xiě)的函數(shù)的文章關(guān)于其他激勵(lì)函數(shù),可以網(wǎng)上找資料進(jìn)行了解,很多基礎(chǔ)性的數(shù)學(xué)知識(shí),放到一些比較具體的應(yīng)用,會(huì)顯得非常的有意思。

先上代碼

import tensorflow
from tensorflow.examples.tutorials.mnist import input_data
import matplotlib.pyplot as plt

# 普通的神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)
# 學(xué)習(xí)訓(xùn)練類
class Normal:

    weight = []
    biases = []

    def __init__(self):
        self.times = 1000
        self.mnist = []
        self.session = tensorflow.Session()
        self.xs = tensorflow.placeholder(tensorflow.float32, [None, 784])
        self.ys = tensorflow.placeholder(tensorflow.float32, [None, 10])
        self.save_path = "learn/result/normal.ckpt"

    def run(self):
        self.import_data()
        self.train()
        self.save()

    def _setWeight(self,weight):
        self.weight = weight

    def _setBiases(self,biases):
        self.biases = biases

    def _getWeight(self):
        return self.weight

    def _getBiases(self):
        return self.biases
    # 訓(xùn)練
    def train(self):

        prediction = self.add_layer(self.xs, 784, 10, activation_function=tensorflow.nn.softmax)

        cross_entropy = tensorflow.reduce_mean(
            -tensorflow.reduce_sum(
                self.ys * tensorflow.log(prediction)
                , reduction_indices=[1])
        )
        train_step = tensorflow.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)

        self.session.run(tensorflow.global_variables_initializer())

        for i in range(self.times):
            batch_xs, batch_ys = self.mnist.train.next_batch(100)
            self.session.run(train_step, feed_dict={self.xs: batch_xs, self.ys: batch_ys})
            if i % 50 == 0:
                # images 變換為 labels,images相當(dāng)于x,labels相當(dāng)于y
                accurary = self.computer_accurary(
                    self.mnist.test.images,
                    self.mnist.test.labels,
                    prediction
                )

    # 數(shù)據(jù)導(dǎo)入
    def import_data(self):
        self.mnist = input_data.read_data_sets("MNIST_data", one_hot=True)

    # 數(shù)據(jù)保存
    def save(self):
        saver = tensorflow.train.Saver()
        path = saver.save(self.session,self.save_path)

    # 添加隱藏層
    def add_layer(self,inputs,input_size,output_size,activation_function=None):

        weight = tensorflow.Variable(tensorflow.random_normal([input_size,output_size]),dtype=tensorflow.float32,name="weight")

        biases = tensorflow.Variable(tensorflow.zeros([1,output_size]) + 0.1,dtype=tensorflow.float32,name="biases")
        Wx_plus_b = tensorflow.matmul(inputs,weight) + biases

        self._setBiases(biases)
        self._setWeight(weight)

        if activation_function is None:
            outputs = Wx_plus_b
        else:
            outputs = activation_function(Wx_plus_b,)

        return outputs


    # 計(jì)算結(jié)果數(shù)據(jù)與實(shí)際數(shù)據(jù)的正確率
    def computer_accurary(self,x_data,y_data,tf_prediction):

        prediction = self.session.run(tf_prediction,feed_dict={self.xs:x_data,self.ys:y_data})

        # 返回兩個(gè)矩陣中最大值的索引號(hào)位置,然后進(jìn)行相應(yīng)位置的值大小比較并在此位置設(shè)置為T(mén)rue/False
        correct_predition = tensorflow.equal(tensorflow.argmax(prediction,1),tensorflow.argmax(y_data,1))

        # 進(jìn)行數(shù)據(jù)格式轉(zhuǎn)換,然后進(jìn)行降維求平均值
        accurary = tensorflow.reduce_mean(tensorflow.cast(correct_predition,tensorflow.float32))

        result = self.session.run(accurary,feed_dict={self.xs:x_data,self.ys:y_data})

        return result

# 識(shí)別類
class NormalRead(Normal):

    input_size = 784
    output_size = 10

    def run(self):
        self.import_data()
        self.getSaver()
        origin_input = self._getInput()
        output = self.recognize(origin_input)

        self._showImage(origin_input)
        self._showOutput(output)
        pass

    # 顯示識(shí)別結(jié)果
    def _showOutput(self,output):
        number = output.index(1)
        print("識(shí)別到的數(shù)字:",number)

    # 顯示被識(shí)別圖片
    def _showImage(self,origin_input):
        data = []
        tmp = []
        i = 1
        # 原數(shù)據(jù)轉(zhuǎn)換為可顯示的矩陣
        for v in origin_input[0]:
            if i %28 == 0:
                tmp.append(v)
                data.append(tmp)
                tmp = []
            else:
                tmp.append(v)
            i += 1

        plt.figure()
        plt.imshow(data, cmap="binary")  # 黑白顯示
        plt.show()


    def _setBiases(self,biases):
        self.biases = biases
        pass

    def _setWeight(self,weight):
        self.weight = weight
        pass

    def _getBiases(self):
        return self.biases

    def _getWeight(self):
        return self.weight

    # 獲取訓(xùn)練模型
    def getSaver(self):
        weight = tensorflow.Variable(tensorflow.random_normal([self.input_size, self.output_size]), dtype=tensorflow.float32,name="weight")

        biases = tensorflow.Variable(tensorflow.zeros([1, self.output_size]) + 0.1, dtype=tensorflow.float32, name="biases")

        saver = tensorflow.train.Saver()
        saver.restore(self.session,self.save_path)

        self._setWeight(weight)
        self._setBiases(biases)

    def recognize(self,origin_input):
        input = tensorflow.placeholder(tensorflow.float32,[None,784])
        weight = self._getWeight()
        biases = self._getBiases()

        result = tensorflow.matmul(input,weight) + biases
        resultSof = tensorflow.nn.softmax(result,) # 把結(jié)果集使用softmax進(jìn)行激勵(lì)
        resultSig = tensorflow.nn.sigmoid(resultSof,) # 把結(jié)果集以sigmoid函數(shù)進(jìn)行激勵(lì),用于后續(xù)分類
        output = self.session.run(resultSig,{input:origin_input})

        output = output[0]

        # 對(duì)識(shí)別結(jié)果進(jìn)行分類處理
        output_tmp = []
        for item in output:
            if item < 0.6:
                output_tmp.append(0)
            else :
                output_tmp.append(1)

        return output_tmp

    def _getInput(self):
        inputs, y = self.mnist.train.next_batch(100);
        return [inputs[50]]

以上是程序,整個(gè)程序基于TensorFlow來(lái)實(shí)現(xiàn)的,具體的TensorFlow安裝我就不說(shuō)了。
整個(gè)訓(xùn)練過(guò)程不做多說(shuō),我發(fā)現(xiàn)網(wǎng)上關(guān)于訓(xùn)練的教程很多,但是訓(xùn)練結(jié)果的教程很少。

整個(gè)程序里,通過(guò)tensorflow.train.Saver()save進(jìn)行訓(xùn)練結(jié)果模型進(jìn)行存儲(chǔ),然后再用tensorflow.train.Saver()restore進(jìn)行模型恢復(fù)然后取到訓(xùn)練好的weight和baises。

這里要注意的一個(gè)地方是因?yàn)橐淮涡噪S機(jī)取出100張手寫(xiě)圖片進(jìn)行批量訓(xùn)練的,我在取的時(shí)候其實(shí)也是批量隨機(jī)取100張,但是我傳入識(shí)別的是一張,通過(guò)以下這段程序:

def _getInput(self):
        inputs, y = self.mnist.train.next_batch(100);
        return [inputs[50]]

注意一下return這里的數(shù)據(jù)結(jié)構(gòu),其實(shí)是取這批量的第50張,實(shí)際上這段程序?qū)懗桑?/p>

def _getInput(self):
        inputs, y = self.mnist.train.next_batch(1);
        return [inputs[0]]

會(huì)更好。
因?yàn)樽R(shí)別的時(shí)候是需要用到訓(xùn)練的隱藏層來(lái)進(jìn)行的,所以在此我雖然識(shí)別的是一張圖片,但是我必須要傳入一個(gè)批量數(shù)據(jù)的這樣一個(gè)結(jié)構(gòu)。

然后再識(shí)別的地方,我使用了兩個(gè)激勵(lì)函數(shù):

resultSof = tensorflow.nn.softmax(result,) # 把結(jié)果集使用softmax進(jìn)行激勵(lì)
resultSig = tensorflow.nn.sigmoid(resultSof,) # 把結(jié)果集以sigmoid函數(shù)進(jìn)行激勵(lì),用于后續(xù)分類

這里的話,第一個(gè)softmax激勵(lì)后的數(shù)據(jù)我發(fā)現(xiàn)得到的是以e為底的指數(shù)形式,轉(zhuǎn)換成普通的浮點(diǎn)數(shù)來(lái)看,不是很清楚到底是什么,那么我在做識(shí)別數(shù)字判斷的時(shí)候就不方便,所以再通過(guò)了一次sigmoid的激勵(lì)。

后續(xù)我通過(guò)一個(gè)循環(huán)判斷進(jìn)行一次實(shí)際上的分類,這個(gè)原因首先要說(shuō)到識(shí)別結(jié)果形式:

[0,0,0,0,0,0,0,0,1,0]

像以上這個(gè)數(shù)據(jù),表示的是8,也就是說(shuō),數(shù)組下表第幾位為1就表示是幾,如0的表示:

[1,0,0,0,0,0,0,0,0,0]

而sigmoid函數(shù)在這個(gè)地方其實(shí)就是對(duì)每個(gè)位置的數(shù)據(jù)進(jìn)行了分類,我發(fā)現(xiàn)如果分類值小于0.52這樣的數(shù)據(jù)其實(shí)代表的是否,也就是說(shuō)此位置的值對(duì)應(yīng)的是0,大于0.52應(yīng)該對(duì)應(yīng)的是真,也就是1;而我在程序里取的是0.6為界限做判斷。

實(shí)際上,這個(gè)界限值應(yīng)該是在神經(jīng)網(wǎng)絡(luò)訓(xùn)練的時(shí)候取的,而不是看識(shí)別結(jié)果來(lái)進(jìn)行憑感覺(jué)取的(雖然訓(xùn)練的時(shí)候的參數(shù)也是憑感覺(jué)取的)

這篇文章是我根據(jù)個(gè)人的一些理解來(lái)寫(xiě)的,后續(xù)如果發(fā)現(xiàn)有錯(cuò)誤,我會(huì)在新文章說(shuō)出來(lái),但這篇文章不做保留,方便后續(xù)檢查思考記錄的時(shí)候知道到底怎么踩坑的。

以下是我上次寫(xiě)的sigmoid函數(shù)的文章:

https://segmentfault.com/a/11...

關(guān)于其他激勵(lì)函數(shù),可以網(wǎng)上找資料進(jìn)行了解,很多基礎(chǔ)性的數(shù)學(xué)知識(shí),放到一些比較具體的應(yīng)用,會(huì)顯得非常的有意思。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/19679.html

相關(guān)文章

  • 最新Github上各DL框架Star數(shù)量大PK

    摘要:下圖總結(jié)了絕大多數(shù)上的開(kāi)源深度學(xué)習(xí)框架項(xiàng)目,根據(jù)項(xiàng)目在的數(shù)量來(lái)評(píng)級(jí),數(shù)據(jù)采集于年月初。然而,近期宣布將轉(zhuǎn)向作為其推薦深度學(xué)習(xí)框架因?yàn)樗С忠苿?dòng)設(shè)備開(kāi)發(fā)。該框架可以出色完成圖像識(shí)別,欺詐檢測(cè)和自然語(yǔ)言處理任務(wù)。 很多神經(jīng)網(wǎng)絡(luò)框架已開(kāi)源多年,支持機(jī)器學(xué)習(xí)和人工智能的專有解決方案也有很多。多年以來(lái),開(kāi)發(fā)人員在Github上發(fā)布了一系列的可以支持圖像、手寫(xiě)字、視頻、語(yǔ)音識(shí)別、自然語(yǔ)言處理、物體檢測(cè)的...

    oogh 評(píng)論0 收藏0
  • 神經(jīng)網(wǎng)絡(luò)基礎(chǔ)

    摘要:要想入門(mén)以及往下理解深度學(xué)習(xí),其中一些概念可能是無(wú)法避免地需要你理解一番,比如什么是感知器什么是神經(jīng)網(wǎng)絡(luò)張量以及運(yùn)算微分梯度下降帶著問(wèn)題出發(fā)在開(kāi)始之前希望你有一點(diǎn)機(jī)器學(xué)習(xí)方面的知識(shí),解決問(wèn)題的前提是提出問(wèn)題,我們提出這樣一個(gè)問(wèn)題,對(duì)數(shù)據(jù)集進(jìn) 要想入門(mén)以及往下理解深度學(xué)習(xí),其中一些概念可能是無(wú)法避免地需要你理解一番,比如: 什么是感知器 什么是神經(jīng)網(wǎng)絡(luò) 張量以及運(yùn)算 微分 梯度下降 ...

    oliverhuang 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<