.net多线程编程(3):线程同步

NET多线程同步方法详解 .NET多线程同步方法详解(一):自由锁(InterLocked) 本文主要描述在C#中线程同步的方法。线程的基本概念网上资料也很多就不再赘述了。直接接入主题,在多线程开发的应用中,线程同步是不可避免的。在.Net框架中,实现线程同步主要通过以下的几种方式来实现,在MSDN的线程指南中已经讲了几种,本文结合作者实际中用到的方式一起说明一下。 1. 维护自由锁(InterLocked)实现同步 2. 监视器(Monitor)和互斥锁(lock) 3. 读写锁(ReadWriteLock) 4. 系统内核对象 1) 互斥(Mutex), 信号量(Semaphore), 事件(AutoResetEvent/ManualResetEvent)2) 线程池 除了以上的这些对象之外实现线程同步的还可以使用Thread.Join方法。这种方法比较简单,当你在第一个线程运行时想等待第二个线程执行结果,那么你可以让第二个线程Join进来就可以了。 立即下载

    随着对多线程学习的深入,你可能觉得需要了解一些有关线程共享资源的问题. .net framework提供了很多的类和数据类型来控制对共享资源的访问。

考虑一种我们经常遇到的情况:有一些全局变量和共享的类变量,我们需要从不同的线程来更新它们,可以通过使用system.threading.interlocked类完成这样的任务,它提供了原子的,非模块化的整数更新操作。

还有你可以使用system.threading.monitor类锁定对象的方法的一段代码,使其暂时不能被别的线程访问。

system.threading.waithandle类的实例可以用来封装等待对共享资源的独占访问权的操作系统特定的对象。尤其对于非受管代码的互操作问题。

system.threading.mutex用于对多个复杂的线程同步的问题,它也允许单线程的访问。

像manualresetevent和autoresetevent这样的同步事件类支持一个类通知其他事件的线程。

不讨论线程的同步问题,等于对多线程编程知之甚少,但是我们要十分谨慎的使用多线程的同步。在使用线程同步时,我们事先就要要能够正确的确定是那个对象和方法有可能造成死锁(死锁就是所有的线程都停止了相应,都在等者对方释放资源)。还有赃数据的问题(指的是同一时间多个线程对数据作了操作而造成的不一致),这个不容易理解,这么说吧,有x和y两个线程,线程x从文件读取数据并且写数据到数据结构,线程y从这个数据结构读数据并将数据送到其他的计算机。假设在y读数据的同时,x写入数据,那么显然y读取的数据与实际存储的数据是不一致的。这种情况显然是我们应该避免发生的。少量的线程将使得刚才的问题发生的几率要少的多,对共享资源的访问也更好的同步。

.net framework的clr提供了三种方法来完成对共享资源 ,诸如全局变量域,特定的代码段,静态的和实例化的方法和域。

(1) 代码域同步:使用monitor类可以同步静态/实例化的方法的全部代码或者部分代码段。不支持静态域的同步。在实例化的方法中,this指针用于同步;而在静态的方法中,类用于同步,这在后面会讲到。

(2) 手工同步:使用不同的同步类(诸如waithandle, mutex, readerwriterlock, manualresetevent, autoresetevent 和interlocked等)创建自己的同步机制。这种同步方式要求你自己手动的为不同的域和方法同步,这种同步方式也可以用于进程间的同步和对共享资源的等待而造成的死锁解除。

(3) 上下文同步:使用synchronizationattribute为contextboundobject对象创建简单的,自动的同步。这种同步方式仅用于实例化的方法和域的同步。所有在同一个上下文域的对象共享同一个锁。 

monitor class 

在给定的时间和指定的代码段只能被一个线程访问,monitor 类非常适合于这种情况的线程同步。这个类中的方法都是静态的,所以不需要实例化这个类。下面一些静态的方法提供了一种机制用来同步对象的访问从而避免死锁和维护数据的一致性。

monitor.enter 方法:在指定对象上获取排他锁。

monitor.tryenter 方法:试图获取指定对象的排他锁。

monitor.exit 方法:释放指定对象上的排他锁。

monitor.wait 方法:释放对象上的锁并阻塞当前线程,直到它重新获取该锁。

monitor.pulse 方法:通知等待队列中的线程锁定对象状态的更改。

monitor.pulseall 方法:通知所有的等待线程对象状态的更改。

通过对指定对象的加锁和解锁可以同步代码段的访问。monitor.enter, monitor.tryenter 和 monitor.exit用来对指定对象的加锁和解锁。一旦获取(调用了monitor.enter)指定对象(代码段)的锁,其他的线程都不能获取该锁。举个例子来说吧,线程x获得了一个对象锁,这个对象锁可以释放的(调用monitor.exit(object) or monitor.wait)。当这个对象锁被释放后,monitor.pulse方法和 monitor.pulseall方法通知就绪队列的下一个线程进行和其他所有就绪队列的线程将有机会获取排他锁。线程x释放了锁而线程y获得了锁,同时调用monitor.wait的线程x进入等待队列。当从当前锁定对象的线程(线程y)受到了pulse或pulseall,等待队列的线程就进入就绪队列。线程x重新得到对象锁时,monitor.wait才返回。如果拥有锁的线程(线程y)不调用pulse或pulseall,方法可能被不确定的锁定。pulse, pulseall and wait必须是被同步的代码段鄂被调用。对每一个同步的对象,你需要有当前拥有锁的线程的指针,就绪队列和等待队列(包含需要被通知锁定对象的状态变化的线程)的指针。

你也许会问,当两个线程同时调用monitor.enter会发生什么事情?无论这两个线程地调用monitor.enter是多么地接近,实际上肯定有一个在前,一个在后,因此永远只会有一个获得对象锁。既然monitor.enter是原子操作,那么cpu是不可能偏好一个线程而不喜欢另外一个线程的。为了获取更好的性能,你应该延迟后一个线程的获取锁调用和立即释放前一个线程的对象锁。对于private和internal的对象,加锁是可行的,但是对于external对象有可能导致死锁,因为不相关的代码可能因为不同的目的而对同一个对象加锁。

如果你要对一段代码加锁,最好的是在try语句里面加入设置锁的语句,而将monitor.exit放在finally语句里面。对于整个代码段的加锁,你可以使用methodimplattribute(在system.runtime.compilerservices命名空间)类在其构造器中设置同步值。这是一种可以替代的方法,当加锁的方法返回时,锁也就被释放了。如果需要要很快释放锁,你可以使用monitor类和c# lock的声明代替上述的方法。

让我们来看一段使用monitor类的代码:

public void some_method()
{

int a=100;

int b=0;

monitor.enter(this);

//say we do something here.

int c=a/b;

monitor.exit(this);

}

上面的代码运行会产生问题。当代码运行到int c=a/b; 的时候,会抛出一个异常,monitor.exit将不会返回。因此这段程序将挂起,其他的线程也将得不到锁。有两种方法可以解决上面的问题。第一个方法是:将代码放入try…finally内,在finally调用monitor.exit,这样的话最后一定会释放锁。第二种方法是:利用c#的lock()方法。调用这个方法和调用monitoy.enter的作用效果是一样的。但是这种方法一旦代码执行超出范围,释放锁将不会自动的发生。见下面的代码:

public void some_method()
{

int a=100;

int b=0;

lock(this);

//say we do something here.

int c=a/b;

}

c# lock申明提供了与monitoy.enter和monitoy.exit同样的功能,这种方法用在你的代码段不能被其他独立的线程中断的情况。 

waithandle class 

waithandle类作为基类来使用的,它允许多个等待操作。这个类封装了win32的同步处理方法。waithandle对象通知其他的线程它需要对资源排他性的访问,其他的线程必须等待,直到waithandle不再使用资源和等待句柄没有被使用。下面是从它继承来的几个类:

mutex 类:同步基元也可用于进程间同步。

autoresetevent:通知一个或多个正在等待的线程已发生事件。无法继承此类。

manualresetevent:当通知一个或多个正在等待的线程事件已发生时出现。无法继承此类。

这些类定义了一些信号机制使得对资源排他性访问的占有和释放。他们有两种状态:signaled 和 nonsignaled。signaled状态的等待句柄不属于任何线程,除非是nonsignaled状态。拥有等待句柄的线程不再使用等待句柄时用set方法,其他的线程可以调用reset方法来改变状态或者任意一个waithandle方法要求拥有等待句柄,这些方法见下面:

waitall:等待指定数组中的所有元素收到信号。

waitany:等待指定数组中的任一元素收到信号。

waitone:当在派生类中重写时,阻塞当前线程,直到当前的 waithandle 收到信号。

这些wait方法阻塞线程直到一个或者更多的同步对象收到信号。

waithandle对象封装等待对共享资源的独占访问权的操作系统特定的对象无论是收管代码还是非受管代码都可以使用。但是它没有monitor使用轻便,monitor是完全的受管代码而且对操作系统资源的使用非常有效率。 

mutex class

mutex是另外一种完成线程间和跨进程同步的方法,它同时也提供进程间的同步。它允许一个线程独占共享资源的同时阻止其他线程和进程的访问。mutex的名字就很好的说明了它的所有者对资源的排他性的占有。一旦一个线程拥有了mutex,想得到mutex的其他线程都将挂起直到占有线程释放它。mutex.releasemutex方法用于释放mutex,一个线程可以多次调用wait方法来请求同一个mutex,但是在释放mutex的时候必须调用同样次数的mutex.releasemutex。如果没有线程占有mutex,那么mutex的状态就变为signaled,否则为nosignaled。一旦mutex的状态变为signaled,等待队列的下一个线程将会得到mutex。mutex类对应与win32的createmutex,创建mutex对象的方法非常简单,常用的有下面几种方法:

一个线程可以通过调用waithandle.waitone 或 waithandle.waitany 或 waithandle.waitall得到mutex的拥有权。如果mutex不属于任何线程,上述调用将使得线程拥有mutex,而且waitone会立即返回。但是如果有其他的线程拥有mutex,waitone将陷入无限期的等待直到获取mutex。你可以在waitone方法中指定参数即等待的时间而避免无限期的等待mutex。调用close作用于mutex将释放拥有。一旦mutex被创建,你可以通过gethandle方法获得mutex的句柄而给waithandle.waitany 或 waithandle.waitall 方法使用。

下面是一个示例:

public void some_method()
{

int a=100;

int b=20;

mutex firstmutex = new mutex(false);

firstmutex.waitone();

//some kind of processing can be done here.

int x=a/b;

firstmutex.close();

}

在上面的例子中,线程创建了mutex,但是开始并没有申明拥有它,通过调用waitone方法拥有mutex。 

synchronization events 

同步时间是一些等待句柄用来通知其他的线程发生了什么事情和资源是可用的。他们有两个状态:signaled and nonsignaled。autoresetevent 和 manualresetevent就是这种同步事件。 

autoresetevent class 

这个类可以通知一个或多个线程发生事件。当一个等待线程得到释放时,它将状态转换为signaled。用set方法使它的实例状态变为signaled。但是一旦等待的线程被通知时间变为signaled,它的转台将自动的变为nonsignaled。如果没有线程侦听事件,转台将保持为signaled。此类不能被继承。 

manualresetevent class

这个类也用来通知一个或多个线程事件发生了。它的状态可以手动的被设置和重置。手动重置时间将保持signaled状态直到manualresetevent.reset设置其状态为nonsignaled,或保持状态为nonsignaled直到manualresetevent.set设置其状态为signaled。这个类不能被继承。 

interlocked class 

它提供了在线程之间共享的变量访问的同步,它的操作时原子操作,且被线程共享.你可以通过interlocked.increment 或 interlocked.decrement来增加或减少共享变量.它的有点在于是原子操作,也就是说这些方法可以代一个整型的参数增量并且返回新的值,所有的操作就是一步.你也可以使用它来指定变量的值或者检查两个变量是否相等,如果相等,将用指定的值代替其中一个变量的值. 

readerwriterlock class 

它定义了一种锁,提供唯一写/多读的机制,使得读写的同步.任意数目的线程都可以读数据,数据锁在有线程更新数据时将是需要的.读的线程可以获取锁,当且仅当这里没有写的线程.当没有读线程和其他的写线程时,写线程可以得到锁.因此,一旦writer-lock被请求,所有的读线程将不能读取数据直到写线程访问完毕.它支持暂停而避免死锁.它也支持嵌套的读/写锁.支持嵌套的读锁的方法是readerwriterlock.acquirereaderlock,如果一个线程有写锁则该线程将暂停;

支持嵌套的写锁的方法是readerwriterlock.acquirewriterlock,如果一个线程有读锁则该线程暂停.如果有读锁将容易倒是死锁.安全的办法是使用readerwriterlock.upgradetowriterlock方法,这将使读者升级到写者.你可以用readerwriterlock.downgradefromwriterlock方法使写者降级为读者.调用readerwriterlock.releaselock将释放锁, readerwriterlock.restorelock将重新装载锁的状态到调用readerwriterlock.releaselock以前. 

结论: 

这部分讲述了.net平台上的线程同步的问题.造接下来的系列文章中我将给出一些例子来更进一步的说明这些使用的方法和技巧.虽然线程同步的使用会给我们的程序带来很大的价值,但是我们最好能够小心使用这些方法.否则带来的不是受益,而将倒是性能下降甚至程序崩溃.只有大量的联系和体会才能使你驾驭这些技巧.尽量少使用那些在同步代码块完成不了或者不确定的阻塞的东西,尤其是i/o操作;尽可能的使用局部变量来代替全局变量;同步用在那些部分代码被多个线程和进程访问和状态被不同的进程共享的地方;安排你的代码使得每一个数据在一个线程里得到精确的控制;不是共享在线程之间的代码是安全的;在下一篇文章中我们将学习线程池有关的知识.

pix4d安装步骤 pix4d三维模型软件的安装步骤 阅读详情

相关推荐

算法基础之数组双指针(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

.NET多线程编程(3):线程同步

<!--google_ad_client = "pub-1294368471619564";google_ad_width = 300;google_ad_height = 250;google_ad_format = "300x250_as";google_ad_type = "text";google_ad_channel ="";google_color_bo

北斗星上的尘 的专栏 927

【数据分析/商业分析】面试题整理——SQL专题

数据分析\商业分析—面试题整理 自己总结的SQL类的面试题 文章目录数据分析\商业分析—面试题整理1.新增用户2.活跃用户数量3.连续登录4.次(n)日留存5.每个科目下分数最高的两名学生

awater_17的博客 1859

微软提供的.Net线程池以及跨线程同步示例

.Net线程池示例: public class Fibonacci{ public Fibonacci(int n, ManualResetEvent doneEvent) { _n = n; _doneEvent = doneEvent; } // Wrapper method for use with thread pool. p...

weixin_30710457的博客 116

【速通版!语义通信基础与前沿学习计划】

🧠语义通信基础与前沿学习计划

dally2的博客 1413

多思计组实验实验六 微程序控制器实验

实验六 微程序控制器实验

qq_53089329的博客 3789

.NET线程同步的三种方法

线程同步:多个线程同时运行时,可能会同时对同一个内存地址进行写入。同步就是协同步调,按预定的先后次序进行运行。如:你说完,我再说。 实现同步的三种方法 1.使用lock锁 class ThredTest { static int money = 10000; static object suo = new object(); static void getMoney(string name) { lock (suo) {

舟舟的博客 1575

AgentScope Java 入门:Spring AI Alibaba 与 AgentScope 的定位与区别

摘要:Spring AI Alibaba是阿里基于Spring AI开发的本地化AI应用框架,旨在服务Java开发者。它提供模型接入、函数调用、RAG等功能,并与阿里云基础设施深度集成。同时,阿里开源了多智能体框架AgentScope,其Java版(AgentScope-Java)专注于Agentic设计理念。两者将协同发展:Spring AI Alibaba侧重Spring生态集成,AgentScope-Java强化智能体能力。未来计划包括支持AgentScope、升级Admin平台,以及推进Server

SmartSi 1547

C# .Net学习笔记—— 异步和多线程(await/async)

1、控制台测试await/async2、C# 5.0 .Net framework4.5 CLR4.0 以后才有,本身是一种语法糖从打印出来的两种执行顺序来看,加了await以后,主线程运行到await这行就会执行回主线程任务。而await后面的代码将由主线程或其他线程来执行await后面的代码,会被封装成委托,在await task之后成为回调(编译器功能,状态机实现) ,这个回调的线程是不确定的,可能是主线程,可能是子线程也可能是其他线程。它可以等价于这里包起来。

weixin_46711336的博客 1335

Python爬虫实战:实时监控美国SEC官网文件更新,助你第一时间掌握市场动态

在资本市场中,信息就是财富。美国证券交易委员会(SEC)官网公开了大量公司披露文件,涵盖财报、招股说明书、内幕交易等重要信息。对投资者、分析师及法律合规人员来说,实时监控这些公开文件具有重要价值。

2201_76125261的博客 595

SD卡烧写Linux kernel——SD卡分区,并烧写uboot,kernel,DTB及filesystem

Linux Ubuntu环境下对SD卡分区(烧写uboot,kernel,及filesystem) 介绍dd命令的使用,SD卡分区、格式化、复制文件等 fdisk命令

weixin_42408707的博客 5057

.NET中的多线程-并行编程

多线程是指一个进程中有多个线程同时执行。每个线程都是独立的执行路径,可以同时执行不同的代码。多线程编程可以提高程序的性能和响应速度,特别是在处理大量数据或者需要长时间等待的任务时。在.NET框架中,多线程编程可以提高程序的性能和并发能力。.NET框架提供了一系列的类和API,用于简化多线程编程。本文介绍了.NET中的多线程-并行编程,并给出了一些示例代码,希望对大家有所帮助。

qq_45798312的博客 1765

深度学习工具包 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&#39;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(&#39;DeepLearnToolbox&#39;));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(&#39;state&#39;,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&#39;); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand(&#39;state&#39;,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 = &#39;sigm&#39;;%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, &#39;Too big error&#39;);```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(&#39;state&#39;,0)sae = saesetup([784 100]);sae.ae{1}.activation_function = &#39;sigm&#39;;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)&#39;)% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;;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, &#39;Too big error&#39;);```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x&#39;,28,28,60000))/255;test_x = double(reshape(test_x&#39;,28,28,10000))/255;train_y = double(train_y&#39;);test_y = double(test_y&#39;);%% 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&#39;ll get around 1.2% errorrand(&#39;state&#39;,0)cnn.layers = { struct(&#39;type&#39;, &#39;i&#39;) %input layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 6, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 2) %sub sampling layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 12, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 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, &#39;Too big error&#39;);```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(&#39;state&#39;,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, &#39;Too big error&#39;);%% ex2 neural net with L2 weight decayrand(&#39;state&#39;,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, &#39;Too big error&#39;);%% ex3 neural net with dropoutrand(&#39;state&#39;,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, &#39;Too big error&#39;);%% ex4 neural net with sigmoid activation functionrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;; % 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, &#39;Too big error&#39;);%% ex5 plotting functionalityrand(&#39;state&#39;,0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = &#39;softmax&#39;; % 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, &#39;Too big error&#39;);%% 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(&#39;state&#39;,0)nn = nnsetup([784 20 10]); nn.output = &#39;softmax&#39;; % 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, &#39;Too big error&#39;);```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

c#.net多线程编程教学(3):线程同步

  随着对多线程学习的深入,你可能觉得需要了解一些有关线程共享资源的问题. .NET framework提供了很多的类和数据类型来控制对共享资源的访问。  考虑一种我们经常遇到的情况:有一些全局变量和共享的类变量,我们需要从不同的线程来更新它们,可以通过使用System.Threading.Interlocked类完成这样的任务,它提供了原子的,非模块化的整数更新操作。  还有你可以使用Sys

因帅被判7年 1016

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

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

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

C#.NET多线程编程(3):线程同步

     随着对多线程学习的深入,你可能觉得需要了解一些有关线程共享资源的问题. .NET framework提供了很多的类和数据类型来控制对共享资源的访问。  考虑一种我们经常遇到的情况:有一些全局变量和共享的类变量,我们需要从不同的线程来更新它们,可以通过使用System.Threading.Interlocked类完成这样的任务,它提供了原子的,非模块化的整数更新操作。  还有你

cjb9937的专栏 307

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

上一篇: mscorwks.dll在.net中的地位以及在.net代码保护方面的应...
下一篇: 在.net 应用程序设计中如何选择class, abstract class ...
Labber
博客等级 码龄19年 26粉丝 1976原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值