-深度学习-

目录

什么是深度学习?

深度学习与机器学习

特征工程重要性

深度学习与人脑

要求

深度学习——卷积神经网络如何工作?

一维CNN

二维CNN

基于数字识别的深度学习代码示例

下载训练和测试数据集

通过GPU使用硬件提高深度学习性能

GPU激活

GPU测试代码

使用软件库提高深度学习性能

参考


什么是深度学习?

实际上深度学习是机器学习的一个分支。机器学习包括一些不同类型的算法,它们获取数千个数据并尝试从中学习以预测未来的新事件。但是深度学习将神经网络应用为扩展或变体形状。深度学习具有处理百万点数据的能力。

深度学习最基本的基础设施可能是:它选择最佳功能的能力。事实上,深度学习总结数据并根据压缩数据计算结果。这是人工智能真正需要的,尤其是当我们拥有庞大的数据库和巨大的计算能力时。

深度学习具有受神经网络启发的顺序层。这些层具有非线性功能,具有特征选择的职责。每层都有一个输出,将用作下一层的输入。深度学习应用包括计算机视觉(例如人脸或物体识别)、语音识别、自然语言处理(NLP)和网络威胁检测。

深度学习与机器学习

机器学习和深度学习之间的主要区别在于:在ML中,我们需要人工干预来选择特征提取,而在DL中,它将通过嵌入其架构中的直观知识来完成。这种差异极大地影响了它们在精度或速度方面的性能。由于手动特征检测总是存在人为错误,因此深度学习可能是海量数据计算的最佳选择。

DLML之间的共同点是它们都在有监督和无监督的情况下工作。DL只是基于NN,而它在CNN - RNN等中改变了它的形状和操作。但是ML有不同的算法,它们基于统计和数学科学。虽然这并不意味着DL只是在神经网络上,但DL还可以使用各种ML算法,通过制作混合函数来提高性能。例如,DL可以应用支持向量机(SVM)作为自己的激活函数,而不是softmax[1]

特征工程重要性

我们试图将机器作为人工智能中的一个独立工具来思考哪些需要较少的程序员干预。自动化机器的最大特点是;他的思维方式,如果他的思维方式与人脑最相似,那么他将在最好的机器比赛中获胜。那么让我们看看做出准确决策的支柱属性是什么。记住我们的童年,当我们看到物体但我们不知道它们的属性,例如名称、确切尺寸、重量等。但是我们可以通过注意一件重要的事情来快速对它们进行分类。例如,通过观察一只动物,我们一听到它的声音barking就注意到它是Dog,或者当我们听到它的声音meowing时我们注意到它是Cat。所以在这里,动物的声音比大小更有效,因为作为经验,当我们看到与其他动物大小相似的动物时,我们的大脑开始关注最显着的特征,即声音。另一方面,当我们看到动物园里最高的动物,我们忽略所有其他特征并说是的,它是长颈鹿

这是大脑中的奇迹,因为它可以推断情况并根据同一问题中的不同情况,例如动物检测,将一个特征作为他做出决定的最终关键,这种态度给出的结果将是准确而且快速。另一个说明特征工程重要性的故事是二十问游戏,如果你到现在还没有玩过,请看这里

如果玩家有能力提出正确的问题,并且根据最近的答案,他应该提出并改进下一个问题,则该玩家将获胜。这些问题是连续的,下一个问题100%取决于上一个答案。以前的答案有责任使过滤为玩家达到目标添加澄清。每个问题在神经网络中都有一个隐藏层,该隐藏层连接到下一层,它们的输出将用作下一层的输入。我们的第一个问题总是从它还活着吗?开始。通过这个问题,我们消除了一半的可能性。这种省略和删除导致我们在新类别中提出更好的问题,显然我们不能在没有先前答案的情况下提出下一个问题,这在我们的大脑中进行了澄清和过滤。

深度学习与人脑

深度学习在精度和速度方面几乎是对人脑的模仿。卷积神经网络(CNN)的灵感来自大脑皮层。如下图所示,视觉皮层已经覆盖了整个视野。这些敏感单元具有内核或过滤矩阵的作用,我们将在本文后面关注。上帝创造了这些细胞来提取来自眼睛的重要数据。

假设学生有考试并且他们正在准备自己,他们开始阅读这本书,同时他们拿起一本书的重要部分并将其写在笔记上或通过突出显示它们。在两者中,他们都倾向于减少书的体积,并将100页总结为两页,便于参考和复习。类似的场景也发生在DL CNN上,这次我们需要一个更小的矩阵来过滤和移除数据。

要求

我强烈建议并要求您仔细阅读下面列出的第一篇和第二篇文章,因为它们的概念将是必需的,并且我假设您了解有关线性回归和神经网络的一切。

  1. 机器学习 - 线性回归梯度下降
  2. 机器学习 - 朴素贝叶斯分类器
  3. 机器学习 - 随机森林 - 决策树

深度学习——卷积神经网络如何工作?

深度学习是一种具有两个以上隐藏层的神经网络。如果您不熟悉神经网络,请研究此链接。由于更多的层会导致过度拟合,因此有更多的数据。当我们从训练数据集制作出真正完整的模型并与测试集匹配并且模型内部总是有一个答案时,就会发生过度拟合。模型的优点之一是可以概括而不是完全巧合。

我们不能,甚至可以,做一个完整的模型是错误的。让我们看看当我们想在模型中分配一个“Y”时会发生什么。我们必须忽略在制作模型时过于理想主义,倾向于使其一般化而不是具体化,为了达到这一点,我们可以应用交叉验证。交叉验证是模型评估方法。最好的方法是使用K-fold交叉验证,尝试将训练集划分为k个部分,并且在每次迭代中,k属于测试,其余k-1是训练集,因此匹配的机会会降低。在卷积神经网络中有一些特定的解决方案来代替K-fold交叉验证,以避免过度拟合,例如dropout则化。

DL中的完全连接意味着一个隐藏层中的每个神经元都与下一层的所有神经元连接。在训练时间应用drop out的情况下,部分神经元将被关闭,在预测时间完成训练后,所有神经元将被打开。因此,DL试图省略和删除冗余数据,模糊它们的作用,增强和加粗重要特征的作用。例如下图,当左图具有高分辨率但在一段时间内DL CNN试图保留重要像素并使其更小。

假设学生有考试并且他们正在准备自己,他们开始阅读这本书,同时他们拿起书的重要部分并将其写在笔记上或突出显示它们。在两者中,他们倾向于减少书籍的体积,并将100页总结成两页,便于参考和复习。类似的场景也发生在DL CNN上,这次我们需要一个更小的矩阵来过滤和移除数据。

我们可以借助较小的矩阵并在原始矩阵和原始矩阵上进行旋转,将数据转换为更小的数据——这更容易依赖于做出决策。我们通过围绕原始矩阵移动滤波器矩阵来进行一些数学计算。例如,在下图中,通过将一个矩阵在原始矩阵上旋转3次,将12个数据点减少到仅3个数据点。这些计算可以最大化或取数据的平均值。

一维CNN

现实世界中没有这样的一维矩阵,但由于它的呈现方式,我更喜欢从一维矩阵开始。我想借助蓝色矩阵上的红色矩阵进行降维。所以蓝色矩阵是真实数据集,红色矩阵是过滤矩阵。我想将具有5个元素的蓝色矩阵转换为3个元素。我从左向右推动红色矩阵(我在每一步中只推动一个元素)。每当有重合时,我将两个相关元素相乘,在多个匹配元素的情况下,我将它们相加。作为通知,红色矩阵是[2 -1 1]并且在翻转它(内核)后变为[1 -1 2]

为了减少矩阵,我正在寻找有效的结果,当所有红色或过滤器元素都被蓝色覆盖时,它们就会发生。我刚拿起[3 5]

import numpy as np

x = np.array([0,1,2,3])
 
w = np.array([2,-1,1])

result = np.convolve(x,w)
result_Valid = np.convolve(x,w, "valid")
print(result)
print(result_Valid)

二维CNN

在二维矩阵中也有类似的故事。翻转后内核矩阵[[-1, 0], [2, 1]]将变为[[1, 2], [0, -1]]。因为在下图中的所有步骤中,滤波器矩阵都在原始训练矩阵中,所以所有交换元素都是有效的。

from scipy import signal as sg

print(sg.convolve([[2, 1, 3],
                   [5, -2, 1],
                   [0, 2, -4]], [[-1, 0],[2, 1]]))

print(sg.convolve([[2, 1, 3],
                   [5, -2, 1],
                   [0, 2, -4]], [[-1, 0],[2, 1]], "valid"))

基于数字识别的深度学习代码示例

我想向您介绍以数据科学家闻名的最佳竞赛社区KAGGLE 。有很多比赛值得锻炼你在机器学习和深度学习方面的能力。此外,对于能够为最近的挑战完成代码的人,也有奖励。有作者编写的内核,您也可以为这些内核做出贡献,它们是学习RPython人工智能的良好来源。此外,您可以使用其数据集作为参考,并使用准备好的数据测试您的代码。

我想练习卷积,请点击这里

下载训练和测试数据集

请转到此链接以获取训练和测试数据集。显然,你必须在kaggle网站上注册,然后尝试加入这个比赛。

# -*- coding: utf-8 -*-
"""
Created on Sun Nov 19 05:59:50 2017

@author: Mahsa
"""
import numpy as np
from numpy.random import permutation
import pandas as pd
import tflearn
from tflearn.layers.core import input_data,dropout,fully_connected,flatten
from tflearn.layers.conv import conv_2d,max_pool_2d
from tflearn.layers.normalization import local_response_normalization
from tflearn.layers.estimator import regression
from sklearn.cross_validation import train_test_split


train_Path = r'D:\digit\train.csv'
test_Path = r'D:\digit\test.csv'
  
#Split arrays or matrices into random train and test subsets
#http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html

def split_matrices_into_random_train_test_subsets(train_Path):
    train = pd.read_csv(train_Path)
    train = np.array(train)
    train = permutation(train)
    X = train[:,1:785].astype(np.float32) #feature
    y = train[:,0].astype(np.float32) #label
    return train_test_split(X, y, test_size=0.33, random_state=42)

def reshape_data(Data,Labels):
    Data = Data.reshape(-1,28,28,1).astype(np.float32)
    Labels = (np.arange(10) == Labels[:,None]).astype(np.float32)
    return Data,Labels

X_train, X_test, y_train, y_test = split_matrices_into_random_train_test_subsets(train_Path)

X_train,y_train = reshape_data(X_train,y_train)
X_test,y_test = reshape_data(X_test,y_test)

test_x = np.array(pd.read_csv(test_Path))
test_x = test_x.reshape(-1,28,28,1)
  
def Convolutional_neural_network():
    network  = input_data(shape=[None,28,28,1],name='input_layer')
    network  = conv_2d(network, nb_filter=6,  filter_size=6, 
               strides=1, activation='relu', regularizer='L2')  
    network  = local_response_normalization(network)
    network  = conv_2d(network, nb_filter=12, filter_size=5, 
               strides=2, activation='relu', regularizer='L2') 
    network  = local_response_normalization(network)
    network  = conv_2d(network, nb_filter=24, filter_size=4, 
               strides=2, activation='relu', regularizer='L2')
    network  = local_response_normalization(network)    
 
    network = fully_connected(network, 128, activation='tanh')
    network = dropout(network, 0.8)
    network = fully_connected(network, 256, activation='tanh')
    network = dropout(network, 0.8) 
    network = fully_connected(network, 10, activation='softmax') 
    
    sgd   = tflearn.SGD(learning_rate=0.1,lr_decay=0.096,decay_step=100)
    top_k = tflearn.metrics.top_k(3) #Top-k mean accuracy ,  
            Number of top elements to look at for computing precision
    
    network = regression(network, optimizer=sgd, 
              metric=top_k, loss='categorical_crossentropy')
    return tflearn.DNN(network, tensorboard_dir='tf_CNN_board', tensorboard_verbose=3)
    
model = Convolutional_neural_network()
model.fit(X_train, y_train, batch_size=128, 
          validation_set=(X_test,y_test), n_epoch=1, show_metric=True)

P = model.predict(test_x)

index = [i for i in range(1,len(P)+1)]
result = []
for i in range(len(P)):
    result.append(np.argmax(P[i]).astype(np.int))

res = pd.DataFrame({'ImageId':index,'Label':result})
res.to_csv("sample_submission.csv", index=False)

通过GPU使用硬件提高深度学习性能

游戏开发者、图形设计师和数据科学家之间的一个共同重要因素是矩阵。图像、视频或复杂数据中的每个数据点在矩阵元素中都有一个值。我们所做的任何事情都包括一些数学运算来转换矩阵。

对于通常的处理,中央处理器是一个很好的答案,但在具有大量数据的高级数学和统计运算中,CPU无法容忍,我们必须使用为数学困难函数设计的图形处理单元(GPU)。因为深度学习包括需要复杂计算的函数,例如卷积神经网络、激活函数、sigmoid softmax和傅里叶变换,将在GPU上处理,其余95%将在CPU上移动,或者大部分是I/O过程。

GPU激活

  1. 打开开始并带上windows命令提示符cmd ”
  2. 输入dxdiag
  3. 在打开的窗口中查看显示选项卡
  4. 如果名称等于NVIDIA或(NVIDIA GPU - AMD GPU - Intel Xeon Phi)其他公司,则表示板上有GPU卡。
  5. 让我们尝试.theanorc“ C:\users\"yourname"\".theanorc ”上设置配置
  6. [global]节中设置{ device = gpu or cuda0 , floatX = float32 },并且在[gpuarray]中设置preallocate = 1
  7. 如果您想了解更多信息,请看这里。

GPU测试代码

import os
import shuti

destfile = "/home/ubuntu/.theanorc"
open(destfile, 'a').close()
shutil.copyfile("/mnt/.theanorc", destfile) # make .theanorc file in the project directory  

from theano import function, config, shared, sandbox
import theano.tensor as T
import numpy
import time
 
vlen = 10 * 30 * 768  # 10 x #cores x # threads per core
iters = 1000

rng = numpy.random.RandomState(22)
x = shared(numpy.asarray(rng.rand(vlen), config.floatX))

f = function([], T.exp(x))
print(f.maker.fgraph.toposort())
t0 = time.time()
for i in xrange(iters):
    r = f()
t1 = time.time()

print("Looping %d times took %f seconds" % (iters, t1 - t0))
print("Result is %s" % (r))


if numpy.any([isinstance(x.op, T.Elemwise) for x in f.maker.fgraph.toposort()]):
    print('Used the cpu')
else:
    print('Used the gpu')

使用软件库提高深度学习性能

为了提高CNN的性能,也因为不可能用超过TB的海量数据来冲击CPU甚至GPU,我们必须使用一些策略将数据手动分解成一些块进行处理。我使用DASK来防止RAM内存不足崩溃。它负责时间安排。

import dask.array as da

X = da.from_array(np.asarray(X), chunks=(1000, 1000, 1000, 1000))

Y = da.from_array(np.asarray(Y), chunks=(1000, 1000, 1000, 1000))

X_test = da.from_array(np.asarray(X_test), chunks=(1000, 1000, 1000, 1000))

Y_test = da.from_array(np.asarray(Y_test), chunks=(1000, 1000, 1000, 1000))

参考

https://www.codeproject.com/Articles/1216535/Deep-Learning

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值