如何通过Python进行深度学习?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何通过Python进行深度学习?相关的知识,希望对你有一定的参考价值。

作者 | Vihar Kurama 编译 | 荷叶 来源 | 云栖社区 摘要:深度学习背后的主要原因是人工智能应该从人脑中汲取灵感。本文就用一个

参考技术A

作者 | Vihar Kurama

编译 | 荷叶

来源 | 云栖社区

摘要:深度学习背后的主要原因是人工智能应该从人脑中汲取灵感。本文就用一个小例子无死角的介绍一下深度学习!

人脑模拟

深度学习背后的主要原因是人工智能应该从人脑中汲取灵感。此观点引出了“神经网络”这一术语。人脑中包含数十亿个神经元,它们之间有数万个连接。很多情况下,深度学习算法和人脑相似,因为人脑和深度学习模型都拥有大量的编译单元(神经元),这些编译单元(神经元)在独立的情况下都不太智能,但是当他们相互作用时就会变得智能。

我认为人们需要了解到深度学习正在使得很多幕后的事物变得更好。深度学习已经应用于谷歌搜索和图像搜索,你可以通过它搜索像“拥抱”这样的词语以获得相应的图像。-杰弗里·辛顿

神经元

神经网络的基本构建模块是人工神经元,它模仿了人类大脑的神经元。这些神经元是简单、强大的计算单元,拥有加权输入信号并且使用激活函数产生输出信号。这些神经元分布在神经网络的几个层中。

inputs 输入 outputs 输出 weights 权值 activation 激活

人工神经网络的工作原理是什么?

深度学习由人工神经网络构成,该网络模拟了人脑中类似的网络。当数据穿过这个人工网络时,每一层都会处理这个数据的一方面,过滤掉异常值,辨认出熟悉的实体,并产生最终输出。

输入层:该层由神经元组成,这些神经元只接收输入信息并将它传递到其他层。输入层的图层数应等于数据集里的属性或要素的数量。输出层:输出层具有预测性,其主要取决于你所构建的模型类型。隐含层:隐含层处于输入层和输出层之间,以模型类型为基础。隐含层包含大量的神经元。处于隐含层的神经元会先转化输入信息,再将它们传递出去。随着网络受训练,权重得到更新,从而使其更具前瞻性。

神经元的权重

权重是指两个神经元之间的连接的强度或幅度。你如果熟悉线性回归的话,可以将输入的权重类比为我们在回归方程中用的系数。权重通常被初始化为小的随机数值,比如数值0-1。

前馈深度网络

前馈监督神经网络曾是第一个也是最成功的学习算法。该网络也可被称为深度网络、多层感知机(MLP)或简单神经网络,并且阐明了具有单一隐含层的原始架构。每个神经元通过某个权重和另一个神经元相关联。

该网络处理向前处理输入信息,激活神经元,最终产生输出值。在此网络中,这称为前向传递。

inputlayer 输入层 hidden layer 输出层 output layer 输出层

激活函数

激活函数就是求和加权的输入到神经元的输出的映射。之所以称之为激活函数或传递函数是因为它控制着激活神经元的初始值和输出信号的强度。

用数学表示为:

我们有许多激活函数,其中使用最多的是整流线性单元函数、双曲正切函数和solfPlus函数。

激活函数的速查表如下:

反向传播

在网络中,我们将预测值与预期输出值相比较,并使用函数计算其误差。然后,这个误差会传回这个网络,每次传回一个层,权重也会根绝其导致的误差值进行更新。这个聪明的数学法是反向传播算法。这个步骤会在训练数据的所有样本中反复进行,整个训练数据集的网络更新一轮称为一个时期。一个网络可受训练数十、数百或数千个时期。

prediction error 预测误差

代价函数和梯度下降

代价函数度量了神经网络对给定的训练输入和预期输出“有多好”。该函数可能取决于权重、偏差等属性。

代价函数是单值的,并不是一个向量,因为它从整体上评估神经网络的性能。在运用梯度下降最优算法时,权重在每个时期后都会得到增量式地更新。

兼容代价函数

用数学表述为差值平方和:

target 目标值 output 输出值

权重更新的大小和方向是由在代价梯度的反向上采取步骤计算出的。

其中η 是学习率

其中Δw是包含每个权重系数w的权重更新的向量,其计算方式如下:

target 目标值 output 输出值

图表中会考虑到单系数的代价函数

initial weight 初始权重 gradient 梯度 global cost minimum 代价极小值

在导数达到最小误差值之前,我们会一直计算梯度下降,并且每个步骤都会取决于斜率(梯度)的陡度。

多层感知器(前向传播)

这类网络由多层神经元组成,通常这些神经元以前馈方式(向前传播)相互连接。一层中的每个神经元可以直接连接后续层的神经元。在许多应用中,这些网络的单元会采用S型函数或整流线性单元(整流线性激活)函数作为激活函数。

现在想想看要找出处理次数这个问题,给定的账户和家庭成员作为输入

要解决这个问题,首先,我们需要先创建一个前向传播神经网络。我们的输入层将是家庭成员和账户的数量,隐含层数为1, 输出层将是处理次数。

将图中输入层到输出层的给定权重作为输入:家庭成员数为2、账户数为3。

现在将通过以下步骤使用前向传播来计算隐含层(i,j)和输出层(k)的值。

步骤:

1, 乘法-添加方法。

2, 点积(输入*权重)。

3,一次一个数据点的前向传播。

4, 输出是该数据点的预测。

i的值将从相连接的神经元所对应的输入值和权重中计算出来。

i = (2 * 1) + (3* 1) → i = 5

同样地,j = (2 * -1) + (3 * 1) → j =1

K = (5 * 2) + (1* -1) → k = 9

Python中的多层感知器问题的解决

激活函数的使用

为了使神经网络达到其最大预测能力,我们需要在隐含层应用一个激活函数,以捕捉非线性。我们通过将值代入方程式的方式来在输入层和输出层应用激活函数。

这里我们使用整流线性激活(ReLU):

用Keras开发第一个神经网络

关于Keras:

Keras是一个高级神经网络的应用程序编程接口,由Python编写,能够搭建在TensorFlow,CNTK,或Theano上。

使用PIP在设备上安装Keras,并且运行下列指令。

在keras执行深度学习程序的步骤

1,加载数据;

2,创建模型;

3,编译模型;

4,拟合模型;

5,评估模型。

开发Keras模型

全连接层用Dense表示。我们可以指定层中神经元的数量作为第一参数,指定初始化方法为第二参数,即初始化参数,并且用激活参数确定激活函数。既然模型已经创建,我们就可以编译它。我们在底层库(也称为后端)用高效数字库编译模型,底层库可以用Theano或TensorFlow。目前为止,我们已经完成了创建模型和编译模型,为进行有效计算做好了准备。现在可以在PIMA数据上运行模型了。我们可以在模型上调用拟合函数f(),以在数据上训练或拟合模型。

我们先从KERAS中的程序开始,

神经网络一直训练到150个时期,并返回精确值。

深度学习项目演练:如何使用Python和OpenCV进行人脸识别

本文将和大家一起分享如何使用 Python 进行人脸识别 - 在实时实时视频中检测和识别出一个人。

在这个深度学习项目中,我们将学习如何使用 Python 识别实时视频中的人脸。我们将使用 python dlib 的面部识别网络构建这个项目。Dlib 是一个通用的软件库。 使用 dlib 工具包,我们可以制作真实世界的机器学习应用程序。

在这个项目中,我们将首先了解人脸识别器的工作原理,然后我们将使用 Python 构建人脸识别。

 

使用 Python、OpenCV 和深度学习进行人脸识别

关于dlib的人脸识别:

Python 提供了 face_recognition API,它是通过 dlib 的人脸识别算法构建的。 这个 face_recognition API 允许我们实现人脸检测、实时人脸跟踪和人脸识别应用。

项目准备:

首先,你需要从 PyPI 安装 dlib 库和 face_recognition API:

pip3 install dlib 
pip3 install face_recognition

下载源代码:

人脸识别源代码(评论区)

用Python实现人脸识别的步骤:

我们将分两部分构建这个 python 项目。 首先,为这两部分构建两个不同的python文件:

  • embedding.py:在这一步中,我们将以人的图像作为输入。 我们将对这些图像进行人脸嵌入。
  • recognition.py:现在,我们将从相机帧中识别出那个特定的人。

 

1. embedding.py:

首先,在您的工作目录中创建一个文件 embedding.py。 在此文件中,我们将创建特定人脸的人脸嵌入。 使用 face_recognition.face_encodings 方法制作人脸嵌入。这些人脸嵌入是一个 128 维的向量。 在这个向量空间中,同一个人图像的不同向量彼此靠近。 进行人脸嵌入后,我们将它们存储在一个pickle文件中。

将以下代码粘贴到此 embedding.py 文件中。

  • 导入相关的库:
import sys
import cv2 
import face_recognition
import pickle
  • 要识别 pickle 文件中的人,请将其姓名和唯一 id 作为输入:
name=input("enter name")
ref_id=input("enter id")
  • 创建一个pickle文件和字典来存储人脸编码:
try:
    f=open("ref_name.pkl","rb")

    ref_dictt=pickle.load(f)
    f.close()
except:
    ref_dictt={}
ref_dictt[ref_id]=name


f=open("ref_name.pkl","wb")
pickle.dump(ref_dictt,f)
f.close()

try:
    f=open("ref_embed.pkl","rb")

    embed_dictt=pickle.load(f)
    f.close()
except:
    embed_dictt={}
  • 打开网络摄像头和一个人的 5 张照片作为输入并创建其嵌入:

 

在这里,我们将特定人的嵌入存储在 embed_dictt 字典中。 我们已经在之前的状态中创建了 embed_dictt。 在这本字典中,我们将使用那个人的 ref_id 作为键。

要拍摄图像,请按“s”五次。 如果要停止相机,请按“q”:

for i in range(5):
    key = cv2. waitKey(1)
    webcam = cv2.VideoCapture(0)
    while True:
       
        check, frame = webcam.read()

        cv2.imshow("Capturing", frame)
        small_frame = cv2.resize(frame, (0, 0), fx=0.25, fy=0.25)
        rgb_small_frame = small_frame[:, :, ::-1]
  
        key = cv2.waitKey(1)

        if key == ord('s') : 
            face_locations = face_recognition.face_locations(rgb_small_frame)
            if face_locations != []:
                face_encoding = face_recognition.face_encodings(frame)[0]
                if ref_id in embed_dictt:
                    embed_dictt[ref_id]+=[face_encoding]
                else:
                    embed_dictt[ref_id]=[face_encoding]
                webcam.release()
                cv2.waitKey(1)
                cv2.destroyAllWindows()     
                break
        elif key == ord('q'):
            print("Turning off camera.")
            webcam.release()
            print("Camera off.")
            print("Program ended.")
            cv2.destroyAllWindows()
            break

  • 使用面部嵌入更新 pickle 文件。

在这里,我们将 embed_dictt 存储在 pickle 文件中。 因此,为了识别那个人,我们可以直接从这个文件中加载它的嵌入:

f=open("ref_embed.pkl","wb")
pickle.dump(embed_dictt,f)
f.close()
  • 现在是时候执行 python 项目的第一部分了。

运行 python 文件并使用人名及其 ref_id 获取五个图像输入:

python3 embedding.py

2.recognition.py:

在这里,我们将再次从相机帧创建人物嵌入。然后,我们将新的嵌入与 pickle 文件中存储的嵌入进行匹配。同一个人的新嵌入将接近其在向量空间中的嵌入。因此,我们将能够识别出这个人。

现在,创建一个新的 python 文件识别.py 并粘贴以下代码:

  • 导入库:
import face_recognition
import cv2
import numpy as np
import glob
import pickle
  • 加载存储的 pickle 文件:
f=open("ref_name.pkl","rb")
ref_dictt=pickle.load(f)        
f.close()

f=open("ref_embed.pkl","rb")
embed_dictt=pickle.load(f)      
f.close()
  • 创建两个列表,一个用于存储 ref_id,另一个用于各自的嵌入:
known_face_encodings = []  
known_face_names = []  


for ref_id , embed_list in embed_dictt.items():
    for my_embed in embed_list:
        known_face_encodings +=[my_embed]
        known_face_names += [ref_id]
  • 启动网络摄像头以识别此人:
video_capture = cv2.VideoCapture(0)

face_locations = []
face_encodings = []
face_names = []
process_this_frame = True

while True  :
  
    ret, frame = video_capture.read()

    small_frame = cv2.resize(frame, (0, 0), fx=0.25, fy=0.25)
    rgb_small_frame = small_frame[:, :, ::-1]

    if process_this_frame:

        face_locations = face_recognition.face_locations(rgb_small_frame)
        face_encodings = face_recognition.face_encodings(rgb_small_frame, face_locations)

        face_names = []
        for face_encoding in face_encodings:

            matches = face_recognition.compare_faces(known_face_encodings, face_encoding)
            name = "Unknown"

            face_distances = face_recognition.face_distance(known_face_encodings, face_encoding)
            best_match_index = np.argmin(face_distances)
            if matches[best_match_index]:
                name = known_face_names[best_match_index]
            face_names.append(name)

    process_this_frame = not process_this_frame

    for (top_s, right, bottom, left), name in zip(face_locations, face_names):
        top_s *= 4
        right *= 4
        bottom *= 4
        left *= 4

        cv2.rectangle(frame, (left, top_s), (right, bottom), (0, 0, 255), 2)

        cv2.rectangle(frame, (left, bottom - 35), (right, bottom), (0, 0, 255), cv2.FILLED)
        font = cv2.FONT_HERSHEY_DUPLEX
        cv2.putText(frame, ref_dictt[name], (left + 6, bottom - 6), font, 1.0, (255, 255, 255), 1)
    font = cv2.FONT_HERSHEY_DUPLEX

    cv2.imshow('Video', frame)

    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

video_capture.release()
cv2.destroyAllWindows()

现在运行项目的第二部分来识别这个人:

python3 recognise.py

概括:

今天分享的这个深度学习项目教你如何使用python库dlib和face_recognition APIs(OpenCV的)开发人脸识别项目。它介绍了 face_recognition API。 我们分两部分实现了这个python项目:

  • 在第一部分中,我们已经看到了如何存储有关人脸结构的信息,即人脸嵌入。 然后我们学习如何存储这些嵌入。
  • 在第二部分中,我们已经看到了如何通过将新的人脸嵌入与存储的人脸嵌入进行比较来识别人。

人脸识别技术的应用

目前,从我国人脸识别技术应用来看,主要集中在三大领域:考勤门禁、安防以及金融。具体如:安防监控、视频中的人脸检测、人脸识别、人流量统计等,广泛应用在小区、楼宇的智能门禁,周界可疑人员徘徊检测、景区人流量统计等等。

TSINGSEE青犀视频基于多年视频领域的技术经验积累,将AI检测、智能识别技术融合到各个应用场景中,典型的示例如EasyCVR视频融合云服务,具有AI人脸识别、车牌识别、语音对讲、云台控制、声光告警、监控视频分析与数据汇总的能力。

以上是关于如何通过Python进行深度学习?的主要内容,如果未能解决你的问题,请参考以下文章

Python深度学习之路-1 机器学习概论

Python深度学习之路-1 机器学习概论

Python深度学习之路-1 机器学习概论

人脸识别实战:使用Python OpenCV 和深度学习进行人脸识别

《Python深度学习》第二章笔记

深度学习项目演练:如何使用Python和OpenCV进行人脸识别