NuPlayer介绍

Android NuPlayer MediaPlayer的核心是NuPlayer实现视频的解码、渲染、同步、输出。NuPlayer基于StagefrightPlayer的基础类构建,利用了底层ALooper/AHandler机制来进行异步解码播放,ALooper轮询队列中的消息,把消息推送道AHandler中处理,最后通过handleMessage函数回调,做相应的逻辑处理。 阅读详情

简介

Android2.3时引入流媒体框架,而流媒体框架的核心是NuPlayer。Android4.0之后HttpLive和RTSP协议开始使用NuPlayer播放器,Android5.0(L版本)之后本地播放也开始使用NuPlayer播放器。
类图

视频是如何播放的

这里写图片描述
DataSource有两个概念:

  1. 上面框图中的DataSourceInput(或者直接叫DataSource)指的是单纯的数据输入(未demux的)。
  2. 在后文中setDataSource中DataSource指的是从数据输入到demux输出的一个过程(即图中最外层的DataSource)。

VideoTrack与AudioTrack指的是Extractor(即demux)的两个通道,从这里输出的分别就是单纯的解复用后的Video和Audio流。再经过Decoder后输出的就是音、视频的输出了:

  • VideoRenderer + Surface即视频的输出;
  • AudioSink即音频的输出;
NuPlayerDriver.cpp

这里写图片描述

Ahandle机制

初始化NuPlayer对象,并进入NuPlayer播放流程,其实NuPlayer实现的是Ahandle机制:
这里写图片描述
这里写图片描述

  • Android5.0之前,StageFright架构使用的传递消息机制是TimedEventQueue模型
  • Android升级到5.0之后,NuPlayer使用的是AHandler消息机制,类似于Handler
    这里写图片描述
NuPlayer::setDataSourceAsync

NuPlayer获取DataSource通过URI的前缀判断媒体类型,比如http、rtsp,还是本地播放,然后创建相应的DataSource,走入相应流程。根据URI创建相应的DataSource,再进一步的利用DataSource创建MediaExtractor做A/V分离。
这里写图片描述

NuPlayer::onMessageReceived

OnMessageReceived是Nuplayer的核心部分,大部分消息的实现均在OnMessageReceived中完成
这里写图片描述
环境及相应DataSource都准备好以后,上层发送start开始播放流程以后,开始创建解码器
这里写图片描述
这里写图片描述
创建解码器
这里写图片描述
这里写图片描述

NuPlayerDecoder.cpp

这里写图片描述

MediaCodec::CreateByType

进入MediaCodec.cpp
这里写图片描述
进入init中
这里写图片描述
这里写图片描述

MediaCodec::onMessageReceived

这里写图片描述
这里写图片描述

ACodec::initiateAllocateComponent

这里写图片描述
这里写图片描述

ACodec::onAllocateComponet

这里写图片描述
这里写图片描述

OMXMaster::addPlugin

OMX的创建干了两件事,第一,初始化OMXMaster加载第三方解码器;第二,初始化节点数,为分配正在可用节点。
这里写图片描述

音视频同步
  • 在NuPlayer框架中,音视频同步的工作是由Renderer来完成的,而在StageFright框架, Render是显示用的。
  • NuPlayer框架中,音视频同步的策略是音/视频往后delay,被动同步,而不会主动seek;简单讲就是如果视频来早了会等一下音频,如果视频来晚了会通过丢帧机制同步,连续丢帧直到音视频同步上为止,
    因为音频太敏感,所以只视频做此处理,而音频不做这样的处理,总之策略就是:视频早等晚丢。
  • Stagefright框架中,音视频同步的策略是,视频向前向后双向同步,too late时video会主动往前seek;too early的时候video会delay
  • 在NuPlayer的start步骤中,新建了一个Renderer的循环线程mRendererLooper,并且把mRenderer作为这个循环线程的Handler,在这个线程内对音视频数据进行同步、送显等操作
    这里写图片描述
    这里写图片描述
    这里写图片描述
NuPlayer::renderBuffer

当收到解码器kWhatDrainThisBuffer消息时,NuPlayer会调用到renderBuffer函数,renderBuffer直接调用mRenderer中的queueBuffer函数。
这里写图片描述
这里写图片描述
这里写图片描述

NuPlayerRenderer::queueBuffer

queueBuffer主要发送kWhatQueueBuffer消息,并在接收到kWhatQueueBuffer消息后调用onQueueBuffer函数,函数onQueueBuffer中对于音频和视频数据队列进行push_back和postDrainQueue操作,push_back就是往renderer中的数据队列中存放数据, postDrainQueue就是从renderer的数据队列中取数据,往外送显,因此可以看出renderer中的数据队列实际上只是个中转站,就是为了实现音视频同步。

NuPlayerRenderer::onQueueBuffer

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

NuPlayerRenderer::postDrainVideoQueue

音视频同步的函数postDrainVideoQueue()(视频early情况)
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
判断repost的时间是10ms,还是500ms,根据下面分支判断(上一个时间戳序号减去当前时间戳序号) 。mLastAudioBufferDrained - entry.mBufferOrdinal) <= 0,一般情况下这个值均小于0,所以NuPlayer里面一般repost时间为500ms。
这里写图片描述

NuPlayerRenderer::postDrainVideoQueue
DelayUs的计算:

delayUs = realTimeUs – nowUs
realTimeUs = (mediaTimeUs - currentPositionUs) + nowUs
currentPositionUs = (nowUs - mAnchorTimeRealUs) + mAnchorTimeMediaUs
==》realTimeUs = mediaTimeUs – mAnchorTimeMediaUs +
mAnchorTimeRealUs

mediaTimeUs为传入的时间, mAnchorTimeMediaUs为音频上一帧的时间戳,mAnchorTimeRealUs为播放的起锚时间戳,前2者相减获取当前播放的时间长度,再加上起锚时间从而得到当前的系统时间戳。
nowUs是当前时间,通过函数GetNowUs()获取,每次重新获取的时间都不一样,若不重新获取,一直沿用前面获取的时间值。
如果现在的时间点比预计要播放的时间点提前了500ms以上,就要等,则延时10ms再发送kWhatPostDrainVideoQueue消息,接收到这个消息后继续走回postDrainVideoQueue函数中,即做了10ms的等待。
这里写图片描述
音视频同步的函数onDrainVideoQueue()(视频late情况)
这里写图片描述
这里写图片描述
这里写图片描述
Too Late用来标记是否视频数据现在播放的时间比预期播放的时间晚40ms以上,如果超过40ms,说明现在播放这段数据的时间太晚,要是继续播放这段数据就会主观感觉到视频画面滞后,所以丢弃这段视频数据。

流媒体简介

  • 流媒体是Android2.3时引入的,流媒体框架的核心是NuPlayer,目前流媒体的协议类型主要有:HttpLive、RTSP、HTTP
  • HttpLive和RTSP协议在Android4.0之后开始使用NuPlayer播放器
    这里写图片描述
  • RTSP是由Real network 和Netscape共同提出的如何有效地在IP网络上传输流媒体数据的应用层实时流协议
  • 用于远程建立和控制多媒体流,可以同时进行多个流
  • 多媒体流的传输控制部分由RTP/RTCP负责,协议消息的承载可以是TCP和UDP
  • 语法上和HTTP相似,但它是有状态协议(HTTP是无状态协议)
RTSP
  • RTP(Real-time Transport Protocol)
    RTP是用于Internet上针对多媒体数据流的一种传输层协议,它详细说明了在互联网上传递音频和视频的标准数据包格式
  • RTCP (Real-time Transport Control Protocol
    )RTCP是实时传输协议(RTP)的一个姐妹协议,RTCP为RTP媒体流提供信道外(out-of-band)控制,RTCP本身并不传输数据,但和RTP一起协作将多媒体数据打包和发送,RTCP定期在流多媒体会话参加者之间传输控制数据

简单总结:RTSP发起、终结流媒体,RTP媒体数据载体 、RTCP对RTP进行控制、同步
这里写图片描述

HttpLive
  • HTTPLiveStreaming(缩写是HLS)
    是一个由苹果公司提出的基于HTTP的流媒体网络传输协议,它允许内容提供者通过普通Web服务器向上述客户端提供接近实时的音视频流媒体服务,包括直播和点播;HLS支持将同一节目编码为不同码率的多个替换流,客户端软件可以根据网络带宽的变化在这些不同码率的替换流之间进行智能切换
  • M3U8码流
    M3U8文件是HTTPLive服务器在创建视频源的时候,会创建一个包含各媒体文件引用的索引文件,索引文件被保存为.M3U8文件,这是保存MP3播放列表的.m3u格式的一种扩展
    这里写图片描述
媒体库相关代码路径:

*framework/av/media
framework/base/media
vendor/hisi/ap/hardware/vcodec
vendor/hisi/thirdparty/vcodec/chipmedia/
/vendor/opensource/ffmpeg/
vendor/thirdparty/videocodec/helix/*

android 之 NuPlayer 介绍 是 Android NuPlayer 播放框架的核心渲染模块,负责协调音视频数据的。,确保播放流畅性与时序准确性。 阅读详情

相关推荐

NuPlayer源码分析(二)NuPlayer的音频buffer处理机制

一、引言: 在上一篇博客,对nuplayer的创建流程有了一个分析,并且在末尾引入了输入输出buffer的处理出处,这篇博客将分析nuplayer对音频buffer的处理机制。 先贴出输入输出buffer的核心处理函数: -------------------------------------------------------------------------- onMessageReceived@frameworks\av\media\libmediaplayerservice\nuplayer\N

achina2011jy的博客 2265

MediaPlayer的核心-NuPlayer

之前整理过[Android MediaPlayer源码分析],知道MediaPlayer的核心是NuPlayer实现视频的解码、渲染、同步、输出,这篇深入分析NuPlayer相关的知识体系

Gaga246的博客 1609

Android多媒体——NuPlayer播放器(七)

NuPlayer‌ 是 Android 平台上的一个媒体播放器框架,主要用于处理音视频数据的解码、渲染和控制。NuPlayer 的设计旨在提供高效、灵活的媒体播放解决方案,支持多种媒体格式和编码方式。

小旭的专栏 946

Android 13 - Media框架(6)- NuPlayer

到这里 NuPlayer 的了解就告一段落,里面异步处理的思想 和 播放器的处理流程 还是要多多揣摩学习,回想起自己写的 Player 各种处理速度都不理想,还是太年轻了。startpauseresetAsync再对比下两个暂停的实现方式:pause 通过暂停 Source 送数据,暂停 Render 渲染数据来完成,Decoder 不需要暂停;flush 的暂停通过不给 Decoder 喂数据来实现,不需要暂停 Source。

青山渺渺 4910

Astah 9.0升级步骤(Widnows/Mac OS)

Astah Professional是一款全新的轻量级UML建模工具。软件集思维导图和UML建模于一体,采用100%纯JAVA构建, 兼容性强,不仅能够实现分布式建模、项目合并,还能够实现和其它建模工具的交互。

tequiero777的博客 2824

matlab生成blocks、bumps和doppler标准测试信号

关键函数:wnoise使用方式X = wnoise(FUN,N) [X,XN] = wnoise(FUN,N,SQRT_SNR) [X,XN] = wnoise(FUN,N,SQRT_SNR,INIT)X = wnoise(FUN,N) 返回由 FUN给出的信号,长度为2^N,幅值范围[0,1].[X,XN] = wnoise(FUN,N,SQRT_SNR) ,返回了一个测试信号X,以及一个加噪

ZSZ_shsf的博客 6579

转:NuPlayer介绍

一篇不错的nuplayer文章http://blog.sina.com.cn/s/blog_6e65e8cc0102wlga.html 转载于:https://blog.51cto.com/lindt/1955554

weixin_34061555的博客 114

MID360+fastlio功能笔记

前言。

qq_35598561的博客 5298

Android中基于Nuplayer的RTSP框架解析

一、整体框架图 Android中基于NuPlayer的RTSP框架如下图所示(该图来自网上)。 整个图主要分为两个部分,一部分是NuPlayer的架构,另一部分则是实现了基于RTSP的流媒体播放功能,即RTSPSource。当然还有一些其他的Source,如图中的HTTPLiveSource,还有图中没有画出的GenericSource、StreamingSou

u010025003的博客 1647

从零完成 STM32 + ESP-01S + 云服务器 TCP 通信测试

STM32 通过 USART3 控制 ESP-01S 接入手机 2.4 GHz 热点,随后连接公网云服务器 8.152.204.86:9002。云端在同一 TCP 连接中连续收到 seq=1~6 的测试报文,5 个发送间隔平均约 5.4 秒,说明本次 TCP 上行链路已经打通。

weixin_51387720的博客 310

Pythia: A Customizable Hardware Prefetching Framework Using Online Reinforcement Learning——“预取”论文解读

参考传送门: 1. Hardware Prefetching笔记 2. 全球百科——缓存预取 3. 百度百科——缓存数据预期技术 目录0. 什么是Hardware Prefetching(本节内容不包括在论文中)1. 简介1.1 关于Hardware Prefetching的一些关键信息1.2 现阶段方法的缺陷1.3 论文团队的目标1.4 核心思想2. 必要的背景知识介绍2.1 强化学习(Reinforcement learning)2.2 为什么说强化学习是一个好的解决思路3. 解决方法与思路3.1 Py

Pinkgranite86的博客 2166

Android NuPlayer播放框架

①Android NuPlayer播放框架 [时间:2016-09] [状态:Open] [关键词:android,nuplayer,开源播放器,播放框架,nuplayerdriver] 0 NuPlayer简介 Android2.3时引入流媒体框架,而流媒体框架的核心是NuPlayer。在之前的版本中一般认为Local Playback就用Stagefrightp

jesse的博客 3172

微信小程序码 createWxaCodeUnlimit 生成总是报错 41030 的解决方案

41030错误本质上就是路径不合法。路径多写了一个斜杠路径带了参数小程序版本未发布或 app.json 配置不一致。如果确认页面存在,可以通过来跳过检查。微信小程序 getUnlimitedQRCode 官方文档路径前不能加 /,参数放 scene,发布版本要有这个页面,不行就关掉 check_path。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 474

Android多媒体框架(一)NuPlayer框架

NuPlayer框架 从5.0之后Android的音视频播放框架就开始全面抛弃AwesomePlayer,本地播放开始采用NuPlayer框架。本章会介绍NuPlayer创建流程、音视频解析、音视频解码器创建、音频Track创建、音频offload播放等NuPlayer相关流程。 音视频播放上层对外的接口都是调用MediaPlayer,做过应用的同学都是MediaPlayer的三步: setDa...

junluoyu000的博客 4654

LFM线性调频信号的MATLAB仿真

线性调频(LFM)是一种不需要伪随机编码序列的扩展频谱调制技术。由于线性调频信号占用的频带宽度远大于信息带宽,所以也可以获得很大的系统处理增益。线性调频信号又称鸟声(Chirp)信号,因为其频谱带宽落于可听范围,则听若鸟声,所以又称Chirp扩展频谱(CSS)技术。LFM技术在雷达、声纳技术中有广泛应用,如在雷达定位技术中,它可在增大射频脉冲宽度、提高平均发射功率、加大通信距离同时又保持足够的信号频谱宽度,不降低雷达的距离分辨率。线性调频(LFM)是一种不需要伪随机编码序列的扩展频谱调制技术。

平时工作较为繁忙,私信消息一般晚上回复,谢谢大家~~ 902

瑞芯微RK3588平台YOLOv8Pose模型RKNN部署与C++优化实战:从模型转换到高效推理的全流程指南-附源码

错误码 | 原因 | 解决方案 || -1001 | ONNX算子不支持 | 升级RKNN SDK至最新版 || -2003 | 量化校准数据不足 | 增加校准图片至500张 || -3005 | 输入尺寸不匹配 | 固定模型输入尺寸为640x640 || 资源消耗 | CPU 35% | NPU 90% |

m0_64661770的博客 989

Android-7.0-Nuplayer概述

转载自http://blog.youkuaiyun.com/miaomiao12345678/article/details/57415505 Nuplayer简介Android2.3时引入流媒体框架,而流媒体框架的核心是NuPlayer。Android4.0之后HttpLive和RTSP协议开始使用N

Evan_Lo的专栏 519

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

NuPlayer源码分析一:播放器创建

摘要

SuperLi 2538

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Android中基于NuPlayer的RTSP框架学习

一、整体框架图 Android中基于NuPlayer的RTSP框架如下图所示(该图来自网上)。 整个图主要分为两个部分,一部分是NuPlayer的架构,另一部分则是实现了基于RTSP的流媒体播放功能,即RTSPSource。当然还有一些其他的Source,如图中的HTTPLiveSource,还有图中没有画出的GenericSource、StreamingSou

sadamoo的专栏 8659

深度学习工具包 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")

上一篇: dump pcm数据和一些备忘
下一篇: 浅谈Binder的基本原理
我把葡萄酿成酒
博客等级 码龄12年 275粉丝 198原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值