久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

面向普通開發(fā)者的機(jī)器學(xué)習(xí)入門

 昵稱50318161 2017-12-06

前言

  1. 最近在摸索這方面相關(guān)的知識(shí),本著整理鞏固,,分享促進(jìn)的精神,。所以有了這篇博文。
  2. 需要注意的是,,本文受眾:對(duì)機(jī)器學(xué)習(xí)感興趣,且愿意花點(diǎn)時(shí)間學(xué)習(xí)的應(yīng)用(業(yè)務(wù))程序員
  3. 我本意是盡量簡(jiǎn)單,,易于理解,,快速上手,短時(shí)間能跑出來東西,,這樣子才能正向激勵(lì)我們的學(xué)習(xí)欲望,。
  4. 基于上述條件,需要你已經(jīng)有一定的開發(fā)經(jīng)驗(yàn),,微不足道的數(shù)學(xué)能力,,以及善用搜索引擎的覺悟。

    開發(fā)環(huán)境搭建

    首先,,我希望你是Linux系用戶,如果你是巨硬黨,,裝一個(gè)VirtualBox吧,然后再裝個(gè)ubuntu,,由于我們只是入個(gè)門,,對(duì)性能要求不高的,。

機(jī)器學(xué)習(xí)相關(guān)的框架也很多,我這里選擇了==keras== keras中文文檔,,后端采用的==tensorflow== 官方網(wǎng)站 ,。那么理所當(dāng)然的,會(huì)用到python來開發(fā),,沒有python經(jīng)驗(yàn)也莫慌,,影響并不大。

  1. ubuntu自帶python 我就不介紹怎么安裝了吧,?
    先安裝pip(我用的python2.7,,后文統(tǒng)一)打開你的終端,輸入這個(gè):(我建議更換下apt-get為國內(nèi)鏡像,安裝完pip后也更換為國內(nèi)鏡像吧)

    sudo apt-get install python-pip python-dev
  2. 安裝tensorflow和keras,,matplotlib
    還是打開終端,,輸入輸入

    pip install tensorflow
    pip install matplotlib
    pip install keras

    安裝完輸入 python 然后import測(cè)試下


    圖1


    你也可以測(cè)試下tensorflow,下面是個(gè)標(biāo)準(zhǔn)hello world

    import tensorflow as tf hello = tf.constant('Hello, TensorFlow!') sess = tf.Session() print(sess.run(hello))

    你看,,ubuntu下安裝環(huán)境這么簡(jiǎn)單,,我不知道你為什么不嘗試下

卷積神經(jīng)網(wǎng)絡(luò)CNN淺析

我建議你先把CNN當(dāng)作一個(gè)黑盒子,不要關(guān)心為什么,,只關(guān)心結(jié)果,。

這里借用了一個(gè)分辨Xo的例子來這里看原文,就是每次給你一張圖,,你需要判斷它是否含有'X'或者'O',。并且假設(shè)必須兩者選其一,不是'X'就是'O',。



下面看一下CNN是怎么分辨輸入的圖像是x還是o,,如果需要你來編程分辨圖像是x還是o,你會(huì)怎么做,?可能你第一時(shí)間就想到了逐個(gè)像素點(diǎn)對(duì)比,。但是,如果圖片稍微有點(diǎn)變化呢,?像是下面這個(gè)x,,它不是標(biāo)準(zhǔn)的x,我們可以分辨它是x,,但是對(duì)于計(jì)算機(jī)而言,,它就只是一個(gè)二維矩陣,逐個(gè)像素點(diǎn)對(duì)比肯定是不行的,。



CNN就是用于解決這類問題的,,它不在意具體每個(gè)點(diǎn)的像素,而是通過一種叫卷積的手段,,去提取圖片的特征,。

什么是特征? 特征就是我們用于區(qū)分兩種輸入是不是同一類的分辨點(diǎn),,像是這個(gè)XXOO的例子,如果要你描述X和O的區(qū)別,,你會(huì)怎么思考,?X是兩條線交叉,O是封閉的中空的,。,。,。

我們來看個(gè)小小的例子,,如果下面兩張圖,,需要分類出喜歡和不喜歡兩類,,那么你會(huì)提取什么作為區(qū)分的特征?(手動(dòng)滑稽)


卷積層

所以對(duì)于CNN而言,,第一步就是提取特征,,卷積就是提取猜測(cè)特征的神奇手段,。而我們不需要指定特征,,任憑它自己去猜測(cè),,就像上圖,我們只需要告訴它,,我們喜歡左邊的,,不喜歡右邊的,然后它就去猜測(cè),,區(qū)分喜不喜歡的特征是黑絲,,還是奶子呢?



假設(shè),,我們上面這個(gè)例子,,CNN對(duì)于X的猜測(cè)特征如上,現(xiàn)在要通過這些特征來分類,。
計(jì)算機(jī)對(duì)于圖像的認(rèn)知是在矩陣上的,,每一張圖片有rgb二維矩陣(不考慮透明度)所以,一張圖片,,應(yīng)該是3x高度x寬度的矩陣。而我們這個(gè)例子就只有黑白,,所以可以簡(jiǎn)單標(biāo)記1為白,,-1為黑。是個(gè)9x9的二維矩陣,。



我們把上面的三個(gè)特征作為卷積核(我們這里是假設(shè)已經(jīng)訓(xùn)練好了CNN,,訓(xùn)練提出的特征就是上面三個(gè),我們可以通過這三個(gè)特征去分類 X ),,去和輸入的圖像做卷積(特征的匹配),。






看完上面的,,估計(jì)你也能看出特征是如何去匹配輸入的,這就是一個(gè)卷積的過程,,具體的卷積計(jì)算過程如下(只展示部分):





把計(jì)算出的結(jié)果填入新的矩陣


其他部分也是相同的計(jì)算



最后,,我們整張圖用卷積核計(jì)算完成后:


三個(gè)特征都計(jì)算完成后:



不斷地重復(fù)著上述過程,將卷積核(特征)和圖中每一塊進(jìn)行卷積操作,。最后我們會(huì)得到一個(gè)新的二維數(shù)組,。其中的值,越接近為1表示對(duì)應(yīng)位置的匹配度高,,越是接近-1,,表示對(duì)應(yīng)位置與特征的反面更匹配,而值接近0的表示對(duì)應(yīng)位置沒有什么關(guān)聯(lián),。

以上就是我們的卷積層,,通過特征卷積,輸出一個(gè)新的矩陣給下一層,。

池化層

在圖像經(jīng)過以上的卷積層后,,得到了一個(gè)新的矩陣,而矩陣的大小,,則取決于卷積核的大小,,和邊緣的填充方式,總之,,在這個(gè)XXOO的例子中,,我們得到了7x7的矩陣。池化就是縮減圖像尺寸和像素關(guān)聯(lián)性的操作,,只保留我們感興趣(對(duì)于分類有意義)的信息,。

常用的就是2x2的最大池。





看完上面的圖,,你應(yīng)該知道池化是什么操作了,。通常情況下,我們使用的都是2x2的最大池,,就是在2x2的范圍內(nèi),,取最大值。因?yàn)樽畲蟪鼗╩ax-pooling)保留了每一個(gè)小塊內(nèi)的最大值,,所以它相當(dāng)于保留了這一塊最佳的匹配結(jié)果(因?yàn)橹翟浇咏?表示匹配越好),。這也就意味著它不會(huì)具體關(guān)注窗口內(nèi)到底是哪一個(gè)地方匹配了,而只關(guān)注是不是有某個(gè)地方匹配上了,。這也就能夠看出,,CNN能夠發(fā)現(xiàn)圖像中是否具有某種特征,而不用在意到底在哪里具有這種特征。這也就能夠幫助解決之前提到的計(jì)算機(jī)逐一像素匹配的死板做法,。


同樣的操作以后,,我們就輸出了3個(gè)4x4的矩陣。

全連接層

全連接層一般是為了展平數(shù)據(jù),,輸出最終分類結(jié)果前的歸一化,。 我們把上面得到的4x4矩陣再卷積 池化,得到2x2的矩陣



全連接就是這樣子,,展開數(shù)據(jù),,形成1xn的'條'型矩陣。


然后再把全連接層連接到輸出層,。之前我們就說過,,這里的數(shù)值,越接近1表示關(guān)聯(lián)度越大,,然后我們根據(jù)這些關(guān)聯(lián)度,,分辨到底是O還是X.



看上圖(圈圈里面的幾個(gè)關(guān)鍵信息點(diǎn)),這里有個(gè)新的圖像丟進(jìn)我們的CNN了,,根據(jù)卷積>池化>卷積>池化>全連接的步驟,,我們得到了新的全連接數(shù)據(jù),然后去跟我們的標(biāo)準(zhǔn)比對(duì),,得出相似度,,可以看到,相似度是X的為0.92 所以,,我們認(rèn)為這個(gè)輸入是X,。

一個(gè)基本的卷積神經(jīng)網(wǎng)絡(luò)就是這樣子的?;仡櫼幌?,它的結(jié)構(gòu):


Relu是常用的激活函數(shù),所做的工作就是max(0,x),,就是輸入大于零,,原樣輸出,小于零輸出零,,這里就不展開了,。

CNN實(shí)現(xiàn)手寫數(shù)字識(shí)別

感覺,這個(gè)mnist的手寫數(shù)字,,跟其他語言的helloworld一樣了,。我們這里來簡(jiǎn)單實(shí)現(xiàn)下。首先,,我建議你先下載好數(shù)據(jù)集,keras的下載太慢了下載地址 下載好以后,,按下面的位置放,,你可能要先運(yùn)行下程序,,讓他自己創(chuàng)建文件夾,不然,,你就手動(dòng)創(chuàng)建吧,。


新建個(gè)python文件,test.py然后輸入下面的內(nèi)容

#coding: utf-8 from keras.datasets import mnist import matplotlib.pyplot as plt # 加載數(shù)據(jù) (X_train, y_train), (X_test, y_test) = mnist.load_data() # 展示下第一張圖 plt.imshow(X_train[0], cmap=plt.get_cmap('PuBuGn_r')) plt.show()

運(yùn)行后出來張圖片,,然后關(guān)掉就行,,這里只是看看我們加載數(shù)據(jù)有沒有問題。
x_train,x_test是我們的圖像矩陣數(shù)據(jù),,是28x28大小,,然后有12500條吧好像。然后y_train,y_test都是標(biāo)簽數(shù)據(jù),,標(biāo)明這張圖代表是數(shù)字幾,。

#coding: utf-8 #Simple CNN import numpy from keras.datasets import mnist from keras.models import Sequential from keras.layers import Dense from keras.layers import Dropout from keras.layers import Flatten from keras.layers.convolutional import Conv2D from keras.layers.convolutional import MaxPooling2D from keras.utils import np_utils seed = 7 numpy.random.seed(seed) #加載數(shù)據(jù) (X_train, y_train), (X_test, y_test) = mnist.load_data() # reshape to be [samples][channels][width][height] X_train = X_train.reshape(X_train.shape[0],28, 28,1).astype('float32') X_test = X_test.reshape(X_test.shape[0],28, 28,1).astype('float32') # normalize inputs from 0-255 to 0-1 X_train = X_train / 255 X_test = X_test / 255 # one hot encode outputs y_train = np_utils.to_categorical(y_train) y_test = np_utils.to_categorical(y_test) num_classes = y_test.shape[1] # 簡(jiǎn)單的CNN模型 def baseline_model(): # create model model = Sequential() #卷積層 model.add(Conv2D(32, (3, 3), padding='valid', input_shape=(28, 28,1), activation='relu')) #池化層 model.add(MaxPooling2D(pool_size=(2, 2))) #卷積 model.add(Conv2D(15, (3, 3), padding='valid' ,activation='relu')) #池化 model.add(MaxPooling2D(pool_size=(2, 2))) #全連接,然后輸出 model.add(Flatten()) model.add(Dense(128, activation='relu')) model.add(Dense(num_classes, activation='softmax')) # Compile model model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) return model # build the model model = baseline_model() # Fit the model model.fit(X_train, y_train, validation_data=(X_test, y_test), epochs=10, batch_size=128, verbose=2)

代碼也挺簡(jiǎn)單,,因?yàn)閗eras也是封裝的挺好的了,。基本你看懂了前面的就沒問題,。

Epoch 1/10 3s - loss: 0.2791 - acc: 0.9203 - val_loss: 0.1420 - val_acc: 0.9579 Epoch 2/10 3s - loss: 0.1122 - acc: 0.9679 - val_loss: 0.0992 - val_acc: 0.9699 Epoch 3/10 3s - loss: 0.0724 - acc: 0.9790 - val_loss: 0.0784 - val_acc: 0.9745 Epoch 4/10 3s - loss: 0.0509 - acc: 0.9853 - val_loss: 0.0774 - val_acc: 0.9773 Epoch 5/10 3s - loss: 0.0366 - acc: 0.9898 - val_loss: 0.0626 - val_acc: 0.9794 Epoch 6/10 3s - loss: 0.0265 - acc: 0.9930 - val_loss: 0.0639 - val_acc: 0.9797 Epoch 7/10 3s - loss: 0.0185 - acc: 0.9956 - val_loss: 0.0611 - val_acc: 0.9811 Epoch 8/10 3s - loss: 0.0150 - acc: 0.9967 - val_loss: 0.0616 - val_acc: 0.9816 Epoch 9/10 4s - loss: 0.0107 - acc: 0.9980 - val_loss: 0.0604 - val_acc: 0.9821 Epoch 10/10 4s - loss: 0.0073 - acc: 0.9988 - val_loss: 0.0611 - val_acc: 0.9819

然后你就能看到這些輸出,,acc就是準(zhǔn)確率了,看后面的val_acc就行,。
其他的參數(shù)那些,,我建議你看看keras的文檔。然后,,入門就結(jié)束了,。如果你感興趣的話,就自己去摸索吧,,后續(xù)我也可能會(huì)繼續(xù)分享相關(guān)的內(nèi)容,。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多