日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

Java软件研发工程师转行之深度学习(Deep Learning)进阶:手写数字识别+人脸识别+图像中物体分类+视频分类+图像与文字特征+猫狗分类

發(fā)布時(shí)間:2024/10/8 java 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java软件研发工程师转行之深度学习(Deep Learning)进阶:手写数字识别+人脸识别+图像中物体分类+视频分类+图像与文字特征+猫狗分类 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

本文適合于對(duì)機(jī)器學(xué)習(xí)和數(shù)據(jù)挖掘有所了解,想深入研究深度學(xué)習(xí)的讀者
1.對(duì)概率基本概率有所了解
2.具有微積分和線(xiàn)性代數(shù)的基本知識(shí)
3.有一定的編程基礎(chǔ)(Python)

Java軟件研發(fā)工程師轉(zhuǎn)行之深度學(xué)習(xí)進(jìn)階:算法與應(yīng)用

  • 1 緒論
  • 2 監(jiān)督學(xué)習(xí)(Supervised Learning)-分類(lèi)(Classification)
    • 2.1 基本概念(Basic Concepts)
      • 2.1.1 什么是深度學(xué)習(xí)?
      • 2.1.2 深度學(xué)習(xí)是什么時(shí)間段發(fā)展起來(lái)的?
      • 2.1.3 深度學(xué)習(xí)能用來(lái)干什么?
      • 2.1.4 深度學(xué)習(xí)目前有哪些代表性的研究機(jī)構(gòu)?
      • 2.1.5 深度學(xué)習(xí)范疇
    • 2.2 神經(jīng)網(wǎng)絡(luò)算法(Neural Network)
      • 2.2.1 人腦識(shí)別圖像
      • 2.2.2 手寫(xiě)數(shù)字識(shí)別
      • 2.2.3 隨機(jī)梯度下降算法
      • 2.2.4 神經(jīng)網(wǎng)絡(luò)識(shí)別手寫(xiě)數(shù)字
      • 2.2.5 基于機(jī)器學(xué)習(xí)手寫(xiě)數(shù)字識(shí)別
        • 第一種 基于灰度值手寫(xiě)數(shù)字識(shí)別
        • 第二種 基于SVM手寫(xiě)數(shù)字識(shí)別
      • 2.2.6 Backpropagation算法
    • 2.3 梯度下降(Gradient Descent)
    • 2.4 卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Network)
      • 人臉識(shí)別
    • 2.5 深度卷積神經(jīng)網(wǎng)絡(luò)(Deep Convolutional Neural Network)
      • 視頻分類(lèi)
  • 3 非監(jiān)督學(xué)習(xí)(Unsupervised Learning)
    • 3.1 限制波爾茲曼機(jī)(Restricted Boltzman Machine)
      • 圖像與文字特征合并應(yīng)用對(duì)圖像分類(lèi)
    • 3.2 自動(dòng)編碼(Autoencoder)
      • 圖像中的物體識(shí)別
    • 3.3 深度信念網(wǎng)絡(luò)(Deep Belief Network)
      • 貓狗分類(lèi)
  • 4 小結(jié)

1 緒論

  • 理解深度學(xué)習(xí)常用模型的算法
  • 學(xué)會(huì)應(yīng)用深度學(xué)習(xí)庫(kù)(Theano、Pyleanrn2)
  • 學(xué)會(huì)使用深度學(xué)習(xí)的方法根據(jù)數(shù)據(jù)集訓(xùn)練模型并開(kāi)發(fā)應(yīng)用
  • 基于深度學(xué)習(xí)的方法對(duì)手寫(xiě)數(shù)字圖片進(jìn)行自動(dòng)識(shí)別
  • 基于深度學(xué)習(xí)的方法自動(dòng)生成自然的符合邏輯的語(yǔ)句
  • 2 監(jiān)督學(xué)習(xí)(Supervised Learning)-分類(lèi)(Classification)

    2.1 基本概念(Basic Concepts)

    2.1.1 什么是深度學(xué)習(xí)?

    • 深度學(xué)習(xí)是基于機(jī)器學(xué)習(xí)延申出來(lái)的一個(gè)新的領(lǐng)域,以人腦結(jié)構(gòu)為啟發(fā)的神經(jīng)網(wǎng)絡(luò)算法為起源,加之模型結(jié)構(gòu)深度的增加發(fā)展,并伴隨著大數(shù)據(jù)和計(jì)算能力的提高而產(chǎn)生的一系列算法。

    2.1.2 深度學(xué)習(xí)是什么時(shí)間段發(fā)展起來(lái)的?

    • 由著名科學(xué)家Hinton等人在2006年和2007年于《Sciences》發(fā)表的文章被提出。

    2.1.3 深度學(xué)習(xí)能用來(lái)干什么?

    • 深度學(xué)習(xí)作為機(jī)器學(xué)習(xí)延申出來(lái)的一個(gè)領(lǐng)域,被應(yīng)用在圖像處理與計(jì)算機(jī)視覺(jué),自然語(yǔ)言處理及語(yǔ)音識(shí)別等領(lǐng)域
    • 自2006年至今,學(xué)術(shù)界與工業(yè)界在深度學(xué)習(xí)方面的研究與應(yīng)用,在以上領(lǐng)域取得了突破性進(jìn)展。
    • 以ImageNet為數(shù)據(jù)庫(kù)的經(jīng)典圖像中的物體識(shí)別競(jìng)賽為例,擊敗了所有傳統(tǒng)算法,取得了前所未有的精確度。

    2.1.4 深度學(xué)習(xí)目前有哪些代表性的研究機(jī)構(gòu)?

    • 學(xué)術(shù)機(jī)構(gòu)以多倫多大學(xué)、紐約大學(xué)、斯坦福大學(xué)為代表,工業(yè)界以Google、FaceBook、百度為代表走在深度學(xué)習(xí)研究與應(yīng)用的前沿。
    from sklearn.datasets import fetch_mldatamnist = fetch_mldata('MNIST original') print mnist.data.shape

    2.1.5 深度學(xué)習(xí)范疇

    • 深度學(xué)習(xí)的基本模型
    • 深度學(xué)習(xí)與機(jī)器學(xué)習(xí)

    2.2 神經(jīng)網(wǎng)絡(luò)算法(Neural Network)

    2.2.1 人腦識(shí)別圖像


    • 深度學(xué)習(xí)識(shí)別圖像
    • 計(jì)算機(jī)識(shí)別圖像
    • 神經(jīng)元
    • 實(shí)際模型更加復(fù)雜
    • 與非門(mén)可以模擬任何方程

    • Sigmoid神經(jīng)元
    • 為了模擬更細(xì)微的變化,輸入和輸出值從0和1,到0,1之間任何數(shù)

    2.2.2 手寫(xiě)數(shù)字識(shí)別

    • 假設(shè)識(shí)別一個(gè)手寫(xiě)數(shù)字圖片
    • 如果圖片是64*64,輸入層總共有64*64=4096個(gè)神經(jīng)元
    • 如果圖片是28*28,輸入層總共有28*28=784個(gè)神經(jīng)元
    • 如果輸出層只有一個(gè)神經(jīng)元,大于0.9說(shuō)明是9,小于0.5說(shuō)明不是9
    • FeedForward Network:神經(jīng)網(wǎng)絡(luò)中沒(méi)有環(huán),信息單向前傳遞

    • 輸入層:28*28=784個(gè)神經(jīng)元
    • 每個(gè)神經(jīng)元代表一個(gè)像素:0.0表示全白,1.0表示全黑
    • 一個(gè)隱藏層:n個(gè)神經(jīng)元,圖中有15個(gè)
    • 輸出層:10個(gè)神經(jīng)元。分別代表手寫(xiě)數(shù)字識(shí)別可能的0-9數(shù)字。例如,第一個(gè)神經(jīng)元(代表0)的輸出值為1,其他的小于1,數(shù)字被識(shí)別為0
    • 訓(xùn)練集:6000張圖片,用來(lái)訓(xùn)練
    • 測(cè)試集:1000張圖片,用來(lái)測(cè)試準(zhǔn)確率
    • x:訓(xùn)練輸入,28*28=784d向量,每個(gè)值代表灰度圖像的像素值
    • y=y(x):10d圖像
    • 如果輸入的某個(gè)圖片是數(shù)字6,理想的輸出:y(x)=(0,0,0,0,0,0,1,0,0,0)
    • 目標(biāo)函數(shù)
    • 最小化問(wèn)題可以用梯度下降解決(gradient descent)
    • C(v)中v有兩個(gè)變量v1,v2
    • 通常可以用微積分解決,如果為v包含的變量過(guò)多,則無(wú)法用微積分解決
    • 一個(gè)變量的情況

    2.2.3 隨機(jī)梯度下降算法

    • 目標(biāo)函數(shù)
    • 變化量
    • 以上三個(gè)公式推出
    • 設(shè)定
    • 所以C不斷減小
    • 回顧目標(biāo)函數(shù)
    • 權(quán)重和偏向更新方程
    • 一層神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)
    • 兩層神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu):MLP,MultiLayer Perceptions

    2.2.4 神經(jīng)網(wǎng)絡(luò)識(shí)別手寫(xiě)數(shù)字

    neural network and deep learning

    • 源代碼地址:https://github.com/mnielsen/neural-networks-and-deep-learning
    • 兩層神經(jīng)網(wǎng)絡(luò)核心代碼
    # coding=utf-8 import numpy as np import randomclass Network(object):def __init__(self, sizes):"""構(gòu)造函數(shù):param sizes: 每層神經(jīng)元的個(gè)數(shù),net = Network([2,3,1])"""self.num_layers = len(sizes)self.sizes = sizes# np.random.randn(y, 1) 隨機(jī)從正太分布(均值0,方差1)中生成self.biases = [np.random.randn(y, 1) for y in sizes[1:]]# weights[1]存儲(chǔ)連接第二層和第三層的權(quán)重self.weights = [np.random.randn(x, y) for x, y in zip(sizes[:-1], sizes[1:])]def feedforward(self, a):"""return the output of the network if 'a' is input:param a::return:"""for b, w in zip(self.biases, self.weights):a = sigmoid(np.dot(w, a) + b)return adef SGD(self, training_data, epochs, mini_batch_size, eta, test_data=None):"""Train the neural network using mini-batch stochastic gradient descent.隨機(jī)梯度下降算法:param training_data: 訓(xùn)練集training_data is a list of tuples "(x,y)" representing the training inputs and the desired outputs:param epochs: 迭代次數(shù):param mini_batch_size: 每一小塊包含多少個(gè)實(shí)例:param eta: 學(xué)習(xí)率:param test_data: 測(cè)試集:return:"""if test_data: n_test = len(test_data)n = len(training_data)for j in xrange(epochs):random.shuffle(training_data) # 隨機(jī)打亂mini_batches = [training_data[k:k + mini_batch_size]for k in xrange(0, n, mini_batch_size)] # 從0到n,間隔為mini_batch_sizefor mini_batch in mini_batches:self.update_mini_batch(mini_batch, eta)if test_data:print "Epoch {0}: {1} / {2}".format(j, self.evaluate(test_data), n_test)else:print "Epoch {0} complete".format(j)def update_mini_batch(self, mini_batch, eta):"""Update the network's weights and biases by applying gradient descentusing back propagation to a single mini batch.:param mini_batch: list of tuples "(x,y)":param eta: learning rate:return:"""nabla_b = [np.zeros(b.shape) for b in self.biases]nabla_w = [np.zeros(w.shape) for w in self.weights]for x, y in mini_batch:delta_nabla_b, delta_nabla_w = self.backprop(x, y)nabla_b = [nb + dnb for nb, dnb in zip(nabla_b, delta_nabla_b)]nabla_w = [nw + dnw for nw, dnw in zip(nabla_w, delta_nabla_w)]self.weights = [w - (eta / len(mini_batch)) * nw for w, nw in zip(self.weights, nabla_w)]self.biases = [b - (eta / len(mini_batch)) * nb for b, nb in zip(self.biases, nabla_b)]# sizes = [2, 3, 1] # print sizes[1:] # bias = [np.random.randn(y, 1) for y in sizes[1:]] # print bias # for x, y in zip(sizes[:-1], sizes[1:]): # print (x, y)net = Network([2, 3, 1]) print net.num_layers print net.sizes print net.biases print net.weights
    • Demo Application
    # coding=utf-8 import mnist_loader # 下載數(shù)據(jù) import network # 神經(jīng)網(wǎng)絡(luò)def main():"""training_data 訓(xùn)練集 50kvalidation_data 驗(yàn)證集 10ktest_data 測(cè)試集 10k"""training_data, validation_data, test_data = mnist_loader.load_data_wrapper()print 'training data'print 'type:', type(training_data)print 'len:', len(training_data)print training_data[0][0].shape # 輸入print training_data[0][1].shape # 輸出print 'validation_data'print 'len:', len(validation_data)print 'test_data'print 'len:', len(test_data)'''輸入層:784個(gè)神經(jīng)元隱藏層:30個(gè)神經(jīng)元輸出層:10個(gè)神經(jīng)元training_data:訓(xùn)練集epochs:30 迭代次數(shù)mini_batch_size:10 每次訓(xùn)練實(shí)例個(gè)數(shù)eta:3.0 學(xué)習(xí)率test_data:測(cè)試集'''net = network.Network([784, 30, 10])net.SGD(training_data, 30, 10, 3.0, test_data=test_data)# net = network.Network([784, 100, 10])# net.SGD(training_data, 30, 10, 3.0, test_data=test_data)# net = network.Network([784, 10])# net.SGD(training_data, 30, 10, 3.0, test_data=test_data)if __name__ == '__main__':main()
    • 結(jié)果
    • 隨著每一輪的迭代,手寫(xiě)數(shù)字識(shí)別的準(zhǔn)確率大概在94.76%

    2.2.5 基于機(jī)器學(xué)習(xí)手寫(xiě)數(shù)字識(shí)別

    第一種 基于灰度值手寫(xiě)數(shù)字識(shí)別

    • 核心代碼
    from collections import defaultdict# My libraries import mnist_loaderdef main():training_data, validation_data, test_data = mnist_loader.load_data()# training phase: compute the average darknesses for each digit,# based on the training dataavgs = avg_darknesses(training_data)# testing phase: see how many of the test images are classified# correctlynum_correct = sum(int(guess_digit(image, avgs) == digit)for image, digit in zip(test_data[0], test_data[1]))print "Baseline classifier using average darkness of image."print "%s of %s values correct." % (num_correct, len(test_data[1]))def avg_darknesses(training_data):""" Return a defaultdict whose keys are the digits 0 through 9.For each digit we compute a value which is the average darkness oftraining images containing that digit. The darkness for anyparticular image is just the sum of the darknesses for each pixel."""digit_counts = defaultdict(int)darknesses = defaultdict(float)for image, digit in zip(training_data[0], training_data[1]):digit_counts[digit] += 1darknesses[digit] += sum(image)avgs = defaultdict(float)for digit, n in digit_counts.iteritems():avgs[digit] = darknesses[digit] / nreturn avgsdef guess_digit(image, avgs):"""Return the digit whose average darkness in the training data isclosest to the darkness of ``image``. Note that ``avgs`` isassumed to be a defaultdict whose keys are 0...9, and whose valuesare the corresponding average darknesses across the training data."""darkness = sum(image)distances = {k: abs(v - darkness) for k, v in avgs.iteritems()}return min(distances, key=distances.get)if __name__ == "__main__":main()
    • 識(shí)別的準(zhǔn)確率只有22.5%

    第二種 基于SVM手寫(xiě)數(shù)字識(shí)別

    • 核心代碼
    def svm_baseline():training_data, validation_data, test_data = mnist_loader.load_data()# trainclf = svm.SVC()clf.fit(training_data[0], training_data[1])# testpredictions = [int(a) for a in clf.predict(test_data[0])]num_correct = sum(int(a == y) for a, y in zip(predictions, test_data[1]))print "Baseline classifier using an SVM."print "%s of %s values correct." % (num_correct, len(test_data[1]))if __name__ == "__main__":svm_baseline()
    • 識(shí)別的準(zhǔn)確率只有32.5%

    2.2.6 Backpropagation算法

  • 通過(guò)迭代來(lái)處理訓(xùn)練集中的實(shí)例
  • 對(duì)比經(jīng)過(guò)神經(jīng)網(wǎng)絡(luò)后輸入層預(yù)值(predict value)與真實(shí)值(target value)之間
  • 反方向(從輸出層 --> 隱藏層 --> 輸入層)
  • 算法詳細(xì)介紹
    • 輸入:數(shù)據(jù)集,學(xué)習(xí)率(Learning Rate),一個(gè)多層前向神經(jīng)網(wǎng)絡(luò)
    • 輸出:一個(gè)訓(xùn)練好的神經(jīng)網(wǎng)絡(luò)(a trained neural network)
    • 初始化權(quán)重(weights)和偏向(bias):隨機(jī)初始化到-1或者1之間,或者-0.5到0.5之間,每個(gè)單元都有一個(gè)偏向
    • 對(duì)于每一個(gè)訓(xùn)練實(shí)例X,執(zhí)行以下步驟:

    • 根據(jù)誤差反向傳送
    • 終止條件:權(quán)重的更新低于某個(gè)閾值 或 預(yù)測(cè)的錯(cuò)誤率低于某個(gè)閾值 或 達(dá)到一定的循環(huán)次數(shù)
    • Overfitting:在訓(xùn)練集上表現(xiàn)好,但是不能泛化到測(cè)試集,測(cè)試集表現(xiàn)差

    2.3 梯度下降(Gradient Descent)

    2.4 卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Network)

    人臉識(shí)別

    2.5 深度卷積神經(jīng)網(wǎng)絡(luò)(Deep Convolutional Neural Network)

    視頻分類(lèi)

    3 非監(jiān)督學(xué)習(xí)(Unsupervised Learning)

    3.1 限制波爾茲曼機(jī)(Restricted Boltzman Machine)

    圖像與文字特征合并應(yīng)用對(duì)圖像分類(lèi)

    3.2 自動(dòng)編碼(Autoencoder)

    圖像中的物體識(shí)別

    3.3 深度信念網(wǎng)絡(luò)(Deep Belief Network)

    貓狗分類(lèi)

    4 小結(jié)

    持續(xù)更新中. . .

    總結(jié)

    以上是生活随笔為你收集整理的Java软件研发工程师转行之深度学习(Deep Learning)进阶:手写数字识别+人脸识别+图像中物体分类+视频分类+图像与文字特征+猫狗分类的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。