PYTHON线程和线程池

Python 多线程和线程池 一,前言 进程:是程序,资源集合,进程控制块组成,是最小的资源单位 特点:就对Python而言,可以实现真正的并行效果 缺点:进程切换很容易消耗cpu资源,进程之间的通信相对线程来说比较麻烦   线程:是进程中最小的执行单位。 特点无法利用多核,无法实现真正意义上是并行效果。 优点:对于IO密集型的操作可以很好利用IO阻塞的时间 二,GIL(全局解释器锁)   python目前有很多解释器,目前使用最广泛的是CPython,还有PYPY和JPython等解释器,.. 阅读详情


进程:运行中的程序

线程:一个进程会默认启动一个线程(线程属于进程),这个线程是默认的主线程

线程应用:

  • 驱动程序:让计算机硬件正常工作
  • 操作系统:让硬件之间相互配合,让应用工作
  • 应用程序:提供各种功能的软件,一般运行在操作系统上

线程的实现

标准库:_thread和threading,其中 threading 实现了对 _thread的封装

threading模块中提供了Thread , Lock , RLock , Condition等组件

主线程 : 当一个程序启动时 , 就有一个线程开始运行 , 该线程通常叫做程序的主线程

子线程 : 因为程序是开始时就执行的 , 如果你需要再创建线程 , 那么创建的线程就是这个主线程的子线程

主线程的重要性体现在两方面 :

  1. 是产生其他子线程的线程

  2. 通常它必须最后完成执行比如执行各种关闭操作

Thread类

常用参数说明

参数说明
target表示调用的对象,即子线程要执行的任务
name子线程名称
args传入target函数中的位置参数,是一个元组,参数后必须加逗号

使用如下

#导入包
from threading import Thread
#调用对象
def funa():
    pass

#实例化对象,创建线程
my_thread = Thread(target = funa)
#线程运行
my_thread.start()

常用方法

方法名描述
Thread.run(self)线程启动时运行的方法,由该方法调用target参数所指定的函数
Thread.start(self)启动进程,start方法就是去帮你调用run方法
Thread.terminate(self)强制终止线程
Thread.join(self,timeout=None)阻塞调用,主线程进行等待
Thread.setDaemon(self,daemonic)将子线程设置为守护线程
Thread.getName(self,name)获取线程名称
Thread.setName(self,name)设置线程名称

示例如下

import threading
import time
#定义线程要运行的函数
def funa(name,a):
    #休眠一段时间便于观察
	time.sleep(a)
    print('我是{}'.format(name))

#创建两个线程
my_ti1 = threading.Thread(target=funa,args=('yuxuan',3))
my_ti2 = threading.Thread(target=funa,args=('fashi',4))
#设置守护线程,守护线程需要在启动线程之前设置
my_ti1.Daemon(True)
#如果设置了子线程为守护线程,那么子线程的一切以主线程为主,即如果主线程还杂执行,那么子线程也会继续执行,如果主线程已经执行完毕,即使子线程未执行完毕,子线程也会结束
#启动线程
my_ti1.start()
my_ti2.start()
#线程阻塞,主线程等待子线程my_ti2执行完毕再继续执行
my_ti2.join()
#设置线程名称
my_ti2.setName('jiucheng')
#获得线程名称
my_ti2.getName()

通过继承来实现多线程

import threading
import time
#继承 threading中的Thread类
class MyThread(threading.Thread):
    #参数通过__init__来初始化
    def __init__(self,name):
        super().__init__()
        self.name = name
    #重写run方法,这个是表示线程活动的方法,必须有
	def run(self):
        #以下写上需要实现的方法
        print('my name is {}'.foramt(self.name))
        time.sleep(2)

if __name__ == '__main__':
    #创建线程实例
    my_t1 = MyThread('t1')
    my_t2 = MyThread('t2')
    #启动线程
    my_t1.start()
    my_t2.start()

如果重写的run方法有参数,那么需要通过___init__方法对参数初始化,如果要使用父类的init方法,加上super().__init__()


线程之间的通讯

在多线程中 , 所有变量对于所有线程都是共享的 , 因此 , 线程之间共享数据最大的危险在于多个线程同时修改一个变量 , 那就乱套了 , 所以我们需要互斥锁 , 来锁住数据。

如下示例

import threading
import time
#定义全局变量a
a = 1

#定义线程要运行的函数
def funa():
    #使用全局变量
    global a
    for i in range(1000):
        a+=1
	
def funb():
    #使用全局变量
    global a
    for i in range(1000):
        a+=2
#创建线程
t1 = threading.Thread(target=funa)
t2 = threading.Thread(target=funb)
#启动线程
t1.start()
t2.start()

上述的示例因为没有加线程锁,当两个线程在执行的过程中会产生竞争,从而不确定哪个线程来执行函数。

所以为了避免对全局变量a的修改出现问题,当需要修改数据a时加上锁。

当一个线程正在访问a时,其他线程会等待当前线程对a的访问完毕,并且解锁,然后实行对a的访问。

加锁 lock.acquire

互斥锁:在多线程中 , 所有变量对于所有线程都是共享的 , 因此 , 线程之间共享数据最大的危险在于多个线程同时修改一个变量 , 那就乱套了 , 所以我们需要互斥锁 , 来锁住数据。

所以上述代码改进如下

from threading import Thread,Lock
#定义全局变量a
a = 1
#锁实例化
lock = Lock()

第一种实现

#定义线程要运行的函数
def funa():
    #使用全局变量
    global a
    for i in range(1000):
        #访问a前加锁
        lock.acquire()
        a+=1
        #访问a完毕解锁
        lock.release()
	
def funb():
    #使用全局变量
    global a
    for i in range(1000):
        #访问a前加锁
        lock.acquire()
        a+=2
        #访问a完毕解锁
        lock.release()
#创建线程
t1 = Thread(target=funa)
t2 = Thread(target=funb)
#启动线程
t1.start()
t2.start()
#阻塞主线程
t1.join()
t2.join()

第二种实现

#定义线程要运行的函数
def funa():
    #使用全局变量
    global a
    for i in range(1000):
        #访问a前加锁,with在对a的访问完毕后会自动解锁
        with lock:
        	a+=1
        
	
def funb():
    #使用全局变量
    global a
    for i in range(1000):
        #访问a前加锁,with在对a的访问完毕后会自动解锁
        with lock:
        	a+=2
        
#创建线程
t1 = Thread(target=funa)
t2 = Thread(target=funb)
#启动线程
t1.start()
t2.start()
#阻塞主线程
t1.join()
t2.join()

线程队列

队列的概念:一个入口,一个出口,先入先出(FIFO)(单项队列)

队列需要导包

from queue import Queue

队列常见方法

方法名描述
put(item)入队
get()出队
empty()#近似测试队列是否为空
full()#近似测试队列是否为满
qsize()#近似队列长度
task_done()任务结束
join()等待完成

一个队列的简单实现

from threading import Thread
from queue import Queue
#产生随机数的包
from random import randint

#创建队列对象,队列长度为10
my_q = Queue(10)
#生产数据
def put_Data(my_q):
    for i in range(10):
        #产生0-1000之间的随机数
        num = randin(0,1000)
        #往队列放数据
        my_q.put(num)
#取出数据
def get_Data(my_q):
    for i in range(10):
        #从队列取出数据
        my_q.get()
        
#创建两个线程,分别用来生成数据和取出数据
t1 = Thread(target=put_Data,args=(my_q,))
t2 = Thread(target=get_Data,args=(my_q,))
#线程启动
t1.start()
t2.start()
#阻塞主线程
t1.join()
t2.join()

通过队列一边生产数据,一边取出数据,取数据时不会对数据产生影响,相当于变相实现了锁的功能,因为队列是一边进,一边出,对于没有入队的数据不会取到,所以保证了数据的安全。

from queue import Queue
#产生随机数的包
from random import randint

#创建队列对象,队列长度为10
my_q = Queue(10)
#生产数据
def put_Data(my_q):
    for i in range(10):
        #产生0-1000之间的随机数
        num = randin(0,1000)
        #往队列放数据
        my_q.put(num)


#得到队列有多少数据,并不是队列的总大小
my_q.qsize()
#put相当于一个任务,当put完成时,需要加上task_done(),put一次就需要task_done()一次
my_q.put(1)
my_q.task_done()
#join是检测任务是否完成,例如如果put了10次,但是task_done()只有9次,那么join()会等待最后一个task_done()完成才会执行,否则会产生阻塞
my_q.join()

线程池

若干个线程等待被使用,当需要使用时,去除线程,使用完一个线程,再次放入线程池中,当代下次使用,达到循环使用线程的目的。

主线程: 相当于生产者,只管向线程池提交任务。

​ 并不关心线程池是如何执行任务的。

​ 因此,并不关心是哪一个线程执行的这个任务。

线程池: 相当于消费者,负责接收任务,

​ 并将任务分配到一个空闲的线程中去执行。

一个线程池的简单实现

#导入包,配合队列实现线程池
from threading import Thread
from queue import Queue

class ThreadPool:
    #线程池初始化
    def __init__(self,n):   #n  线程的数量
        self.queue = Queue()  #放任务的队列
        for i in range(n):
            #创建线程,self.worker线程执行的函数,并指定线程为守护线程
            Thread(target=self.worker,daemon=True).start()
    
    #线程执行的函数,即用来执行任务函数的函数
    def worker(self):
        while True:
            #从队列中取任务func表示任务函数,args,kwargs是任务函数的参数
            func,args,kwargs = self.queue.get()
            #任务函数,执行此函数完成一系列功能
            func(*args,**kwargs)
            #任务函数执行完毕,表示队列的get()任务完成,需要task_done()表示任务完成
            self.queue.task_done()
     
    #往队列中放任务函数,参数func 表示任务函数,args和kwargs表示任务函数参数
    def apply_async(self,func,args=(),kwargs={}):
        #往队列中放任务
        self.queue.put((func,args,kwargs))
        
    #用来判断队列中的所有任务是否完成
    #worker中任务函数执行完一次就会task_done(),如果有10次任务,task_done()次数不够10次,那么join不会执行
    def join(self):
        #用来判断队列任务是否执行完毕
        self.queue.join()
    

初始化函数:用来指定线程池内可以使用的线程的数量。

工作函数:从队列中取出任务分配给线程使用,然后执行任务函数,执行完通知队列任务执行完毕。

队列放任务函数:实现往队列中添加任务函数

阻塞函数:等待队列中所有的任务执行完毕,用来判断是否有任务未执行完毕

效果演示

#接上述代码
#任务函数1
def task1():
    time.sleep(2)
    print('任务1完成')
    
#任务函数2
def task1(*args,**kwargs):
    time.sleep(2)
    print('任务2完成',args,kwargs)
    
    
#线程池实例化,2表示有两个线程
my_pool = ThreadPool(2)
#放任务
my_pool.apply_async(task1)
my_pool.apply_async(task2,args=(1,2),kwargs={'name':'jiucheng','age':18})
#任务放置完成
print('任务放置完成')
#判断任务是否执行完成
my_pool.join()
#如果执行完成,会执行以下代码
print('全部任务完成')

python内置线程池

代码演示如下

#导包
from multiprocessing.pool import ThreadPool
import time

#内置线程池实例化,2表示有两个线程
my_pool = ThreadPool(2)
#任务函数1
def task1():
    time.sleep(2)
    print('任务1完成')
    
#任务函数2
def task2(*args,**kwargs):
    time.sleep(2)
    print('任务2完成',args,kwargs)

#放任务
my_pool.apply_async(task1)
my_pool.apply_async(task2,args=(1,2),kwds={'name':'yuxuan','age':15})
#任务放置完成
print('任务放置完成')
#要求,在join前必须要close,表示这样就不允许再提交其他任务了
my_pool.close()
#判断任务是否执行完成
my_pool.join()
#如果执行完成,会执行以下代码
print('全部任务完成')
【python内功修炼011】:Python进程池和线程池详解 文章目录一、关于线程池\进程池介绍1.1 池的概念1.2 池的划分1.3 线程池和进程池的区别1.5 进程池的创建(流程)二、创建线程池\进程池的两种方法2.1 concurrent和multiprocessing区别三、concurrent.futures模块3.1 模块的介绍3.2 Executor.submit 创建进程/线程池四、concurrent.futures 常用模块4.1 Exe... 阅读详情

相关推荐

浅析Python自带的线程池和进程池

线程池和进程池是Python中实现并发编程的重要工具,它们可以有效地管理和调度多线程或多进程执行任务,提高程序的性能和响应能力。在选择使用线程池还是进程池时,需要根据具体的应用场景和需求来决定。对于I/O密集型任务,线程池是一个不错的选择;而对于CPU密集型任务,尤其是需要利用多核资源的情况,进程池更为合适。同时,我们也需要注意线程池和进程池在使用中可能遇到的问题,如线程间的竞态条件、进程间的通信开销等,并采取相应的措施来解决这些问题。

这家伙很懒,什么都没有留下 1763

【Python基础编程】深入掌握线程与线程池的高效应用

上篇文章讲述的是python的异常处理和文件读写,这篇文章讲述python的并发编程:线程。Python 中使用线程主要通过threading:创建新线程执行目标函数。start():启动线程。join():等待线程结束。Lock():用于同步线程,避免竞态条件。是一种简单且强大的工具,用于在多线程环境中安全地共享数据。通过Queue,我们可以避免直接管理锁的复杂性,并实现线程安全的数据交换和任务分发。如果你需要处理线程间的数据交换、任务队列,Queue是首选。python 的和threading。

易辰的博客 3184

BetaFlight开源飞控源码分析

BetaFlight是穿越机领域比较成熟的开源飞控,本篇文章主要分析一下源代码以及如何使用这个开源代码

weixin_43811044的博客 1万+

python 查看线程池状态

Python相关视频讲解:python的or运算赋值用法用python编程Excel有没有用处?011_编程到底好玩在哪?查看python文件_输出py文件_cat_运行python文件_shelPython中线程池状态查看 在Python中,线程池是一种非常常用的并发编程工具,可以有效地管理和复用线程,提高程序的性...

weixin_41476365的博客 593

算法基础之数组双指针(Leetcode题型归纳)

数组双指针(Leetcode题型归纳)1.前言2.双指针基础3.相向双指针3.1定义3.2真题分析3.2.1两数之和(1)3.2.2两数之和-输入有序数组(167)3.2.3三数之和(15)3.2.4最接近的三数之和(16)3.2.5四数之和(18)3.2.6盛最多水的容器(11)3.2.7有效三角形的个数(611)4.同向双指针-快慢指针4.1定义4.2真题分析4.1.1删除排序数组中的重复项(26)4.1.2移除元素(27)4.1.3删除排序数组中的重复项(80)4.1.4移动零(283)4.1.5数组

Buluchacha的博客 1034

电驱系统功率级“多合一”解决方案

如何提升电驱动系统的产品性能、减小能耗和进一步轻量化,以加强整车市场竞争力,是摆在国内外新能源车企面前的共同课题。为此,具有多年动力总成电子系统开发经验的美国著名半导体及电子解决方案专家——德州仪器(Texas Instrument)提出了多种功率级别“多合一”整合方案和设计思路,助力新能源车企提升技术优势。

yessunday的专栏 1372

Python之线程的五种状态

多线程程序的执⾏顺序是不确定的(操作系统决定)。 当执⾏到sleep语句时, 线程将被阻塞(Blocked) , 到sleep结束后, 线程进⼊就绪(Runnable) 状态, 等待调度。 ⽽线程调度将⾃⾏选择⼀个线程执⾏。 代码中只能保证每个线程都运⾏完整个run函数, 但是线程的启动顺序、run函数中每次循环的执⾏顺序都不能确定 。 1、新状态: 线程对象已经创建,还没有在其上调用start(...

why404 2436

从FOC到你的无人机:深入浅出讲透Clark/Park变换在无刷电机控制中的核心作用

本文深入解析Clark变换与Park变换在无刷电机控制中的核心作用,揭示其如何将三相交流电转换为旋转坐标系下的直流量,实现无人机电机的高效精准控制。通过STM32硬件加速和工程实践案例,展示这对数学变换如何成为FOC算法的神经中枢,大幅提升系统响应速度和能效表现。

weixin_42628941的博客 169

Python中的线程

一起学习Python中线程如何使用,我是小菜鸡,咱们顶峰相见

精益求精,永无止境,永远在路上! 2285

MATLAB Appdesigner开发独立桌面App全流程(一):以打开串口功能为例介绍Appdesigner的基本使用

本文详细介绍了Appdesigner的基本使用,以串口功能为例介绍按钮回调函数的实现以及控件之间通信的问题

Zhuwany的博客 3万+

批量读取_MCGS触摸屏如何实现批量读取modbus数据的方法?

前两天,在一个QQ群里,有同行的朋友问,在MCGS中如何实现批量读取数据,因为他当时面临设备,通讯协议才是MODBUS RTU,同时厂家说地址不能分开读,必须是连续的。鉴于他提供的消息是能够设置的地方都试过了。为此,我直接告诉通过脚本,批量读取的方案。那么这个方案究竟如何实现?且看我下面慢慢道来。一、工具1.modsim:仿真PLC或者第三方设备。2.MCGS组态软件3.串口软件:在电脑中生成两不...

weixin_32511509的博客 8161

草根学Python(十三)线程和进程

前言 拖了好久,不过还是得坚持。喜欢本文的话可以加下公众号【于你供读】。 目录 线程与进程 线程与进程是操作系统里面的术语,简单来讲,每一个应用程序都有一个自己的进程。 操作系统会为这些进程分配一些执行资源,例如内存空间等。在进程中,又可以创建一些线程,他们共享这些内存空间,并由操作系统调用,以便并行计算。 我们都知道现代操作系统比如 Mac OS X,UNIX,Linux,Windows 等可...

weixin_33835690的博客 329

【Word提效 No.010】使用AI一键复制格式刷应用格式

本文介绍利用AI工具WorkBuddy实现Word文档格式批量复制的自动化解决方案。通过简单指令即可将指定段落的格式一键应用到多个目标段落,解决传统格式刷操作繁琐、易出错的问题。方案包含三步操作:准备文档、输入指令模板、验收效果,并提供多种场景的现成指令示例。该工具支持字体、段落等格式属性的批量复制,且不会覆盖原文件,适用于论文、手册等文档的格式统一需求。

u011186532的专栏 78

Python线程和线程池

python中线程使用

Limit_Fly的博客 224

LeRobot — 基于 PyTorch 的真实世界机器人学习框架(一)- 核心框架模块解析

LeRobot 是一个开源的机器人学习框架,由 Hugging Face 开发,旨在降低机器人学的准入门槛。该框架提供完整的机器学习流程支持,包括数据采集、训练、评估和部署。核心模块涵盖数据集标准化、策略算法、硬件抽象和强化学习组件,采用模块化设计实现灵活扩展。通过集成 Hugging Face Hub,用户可以轻松共享数据集和预训练模型。LeRobot 特别注重真实世界的机器人应用,支持多种前沿算法如模仿学习、视觉语言动作模型等,并提供统一的硬件接口和仿真环境适配。

熊猫小妖的AI世界 171

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Python中多线程和线程池的使用方法

上述代码中,我们定义了一个process函数,它接受一个列表作为参数,对列表中的每个元素进行运算,并将结果保存到另一个列表中。在上面的代码中,我们首先定义了一个GetHtmlThread类,继承自threading.Thread类,然后在类的构造函数中传入需要爬取的URL。在主程序中,我们创建了5个线程,每个线程都执行task函数,并传入不同的参数。但是,这种单线程爬取的方式效率较低,因为在获取HTML代码的时候需要等待响应,而在等待响应的过程中CPU会空闲,无法充分利用计算机的性能。

weixin_47831992的博客 4817

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

python进程池和线程池

进程池会预先创建一定数量的进程,任务到来时就将其分配给空闲的进程执行,避免反复创建和销毁进程的开销。进程池的用法:和线程池是一样的;进程池用的是with方法去展示的,也可以用线程池的那种方法是使用,当然线程池的也可以用with方法去使用。如图,由result1结果和result2结果可知,使用submit方法执行任务的顺序是不固定的,使用map方法执行任务的顺序是固定的。如图,由result1结果和result2结果可知,使用submit方法执行任务的顺序和使用map方法执行任务的顺序都是固定的。

leshen_88的博客 1406

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

python进程池和线程池_python 之 进程池与线程池

1.什么时候用池?池的功能是限制启动的进程数或线程数。什么时候应该限制?当并发的任务数远远超过了计算机的承受能力时,即无法一次性开启过多的进程数或线程数时就应该用池的概念将开启的进程数或线程数限制在计算机可承受的范围内2.同步 vs 异步同步,异步指的是提交任务的两种方式同步:提交完任务后就在原地等待,直到任务运行完毕后拿到任务的返回值,再继续运行下一行代码异步:提交完任务(绑定一个回调函数)后根...

weixin_39918248的博客 146

【python面试宝典7】线程池,模块和包

如果应用程序需要频繁的将任务派发到线程中执行,线程池就是必选项,因为创建和释放线程涉及到大量的系统底层操作,开销较大,如果能够在应用程序工作期间,将创建和释放线程的操作变成预创建和借还操作,将大大减少底层开销。在排序阶段,先读入能放在内存中的数据量,将其排序输出到一个临时文件,依此进行,将待排序数据组织为多个有序的临时文件,然后在归并阶段将这些临时文件组合为一个大的有序文件,这个大的有序文件就是排序的结果。的文件,否则无法导入这个包。就是线程池的实现,如果要弄清楚它的工作原理,可以参考下面的内容。

kaggle expert,全球排名前1000,清华计算机研究生,兴趣算法工程 1234

python threading 线程池_python多线程和线程池

在python中,常用的多线程的模块有这么几个_threadthreadingQueue之前有个 thread 模块,被 python3 抛弃了,改名为 _thread。但其实 _thread 也没什么人用,因为 _thread 有的 threading 都有,_thread 没有的 threading 依然有。那么接下来我们就来尝试 threading 吧示例每天得摸 20 条鱼,每隔一秒钟摸一...

weixin_39794130的博客 270

python队列和线程池

锁能解决变量的共享的问题,但是不常见,锁住别人干嘛,咱们不如来好好的排下队。这样就不会死锁了,其实queue是自带锁。 队列 queue是python的标准库,俗称队列.可以直接import引用,在python2.x中,模块名为Queue。python3是小写的queue即可。 在python中,多个线程之间的数据是共享的,多个线程进行数据交换的时候,不能够保证数据的安全性和一致性,所以当多个线...

wulishinian的博客 1177

python 多线程和线程池

1 代码Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--> 1 #coding:utf-8 2 3 #Python的线程池实现 4 5 import Queue 6 import threading 7 ...

dianbu4103的博客 133

python线程池和进程池_Python程序中的进程池和线程池

一、什么是进程池或线程池池:池的是为了限制进程数和线程数什么是时候该用进程池/线程池:当python程序是 计算密集型 且并发的任务量远大于计算机所能承受的范围,无法一次性开启过多的任务数量就应该考虑使用进程池和线程池二、理解同步、异步、同步: 提交了一个任务,必须等任务执行完了,才能执行下一个.无论该任务是否存在阻塞,同步调用都会原地等待,相当于串行异步: 提交了一个任务,可以不用等任务的执行结...

weixin_39845347的博客 296

python进程池和线程池_Python中的进程池和线程池

0.concurrent.futures库之前我们使用多线程(threading)和多进程(multiprocessing)完成常规的需求:在启动的时候start、jon等步骤不能省,复杂的需要还要用1-2个队列。随着需求越来越复杂,如果没有良好的设计和抽象这部分的功能层次,代码量越多调试的难度就越大。有没有什么好的方法把这些步骤抽象一下呢,让我们不关注这些细节,轻装上阵呢?答案是:有的,从Pyt...

weixin_31271165的博客 266

随笔录--Python多线程和线程池

在一次课设的时候做的随心笔录,现在放在优快云上来记录一下。

Bigbin666的博客 1441
上一篇: PYTHON函数
下一篇: PYTHON - base64 模块
Limit_Fly
博客等级 码龄9年 31粉丝 63原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值