【Kotlin学习】Kotlin的类型系统——可空性

Kotlin专题「五」:可空类型?,空安全?.,空值合并?:,非空断言!!,类型安全转换as? 前言:不走心的努力,都是敷衍你自己。你要坚信现在所有过不去的坎,将来总有一天会当笑话说出来。 一、概述   Java 中定义一个变量可以默认不赋值,因为系统默认会赋值一个默认值,并且可以定义一个为 null 的变量,这样在使用的时候就需要判断该变量是否为 null 。从代码的简洁性以及代码的可读性来说,Kotlin 能更好处理,那么 Kotlin 定义一个可为 null 的变量怎么定义呢?下面针对 Kotlin 这一特性来详细讲解。 二、可空类型 三、空安全 四、非空断言 ... 阅读详情

可空性

它是kotlin类型系统中帮助你避免NullPointerException错误的特性。

可空类型

kotlin和java类型系统第一条也可能是最重要的一条区别:kotlin对可空类型的显式的支持,这是一种指出你的程序中哪些变量和属性允许为null的方式。如果一个变量可以为null,对变量的方法的调用就是不安全的,因为这样会导致空指针异常,kotlin不允许这种调用。

int strLen(String s){
	return s.length()
}

这个函数如果传一个null参数,就会抛出空指针异常,我们试着用kotlin重写该函数,但我们要决定这个函数被调用的时候传给它的实参可以是null吗?

不能为null的写法

在这里插入图片描述

此时使用为null的实参调用strLen在编译期就会标记成错误,这个函数中的参数被声明为String类型,在kotlin中表示它必须包含一个String实例。

可以为null的写法

在这里插入图片描述

只需要在类型名称后面加上问号来标记。问好可以加载任何类型的后面来表示这个类型的变量可以存储null引用,没有问号的类型表示这种类型的变量不能存储null引用,这说明所有常见类型默认都是非空的,除非显式把它标记为可空

Type? =Type or null

一旦有一个可空类型的值,能对它进行的操作也会受到限制,比如不能再调用它的方法,也不能把它赋值给非空类型的变量,还不能把可空类型的值传给拥有非空类型参数的函数。我们可以做的最重要的操作就是和null进行比较,一旦进行了比较操作,编译器就会记住,并且在这次比较方法的作用域内把这个值当作非空来对待

在这里插入图片描述

安全调用运算符"?."

该运算符允许你把一次null检查和一次方法调用合并成一个操作。

比如s?.toUpperCase()等同于if(s!=null)s.toUpperCase()else null。也就是说,如果你试图调用一个非空值的方法,这次方法调用会被正常地执行,但如果值是null则调用不会发生,整个表达式的值为null。

这次调用的结果类型也是可空的,s?.toUpperCase()结果的类型是String?,即使它本身的方法声明中是String。

安全调用也可以用来访问属性

在这里插入图片描述

如果你的对象图中有多个可空类型的属性,通常可以在同一个表达式中方便地使用多个安全调用

链接多个安全调用

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

Elvis运算符"?:"

kotlin用Elvis运算符来提供代替null的默认值

在这里插入图片描述

该运算符接收两个运算数,如果第一个运算数不为null,运算结果就是第一个运算数,如果为null,运算结果就是第二个运算数。

它经常与安全调用运算符一起使用,用一个值代替对null对象调用方法时返回的null

在这里插入图片描述

像return和throw这样的操作其实是表达式,因此可以把它们卸载Elvis运算符的右边。这种情况下如果左边的值为null,函数就会立即返回一个值或者抛出一个异常

在这里插入图片描述

安全转换:"as?"

as?运算符长十八值转换成指定的类型,如果值不是合适的类型就返回null,一种常见的模式是把安全转换和Elvis运算符结合使用

使用安全转换实现equals

在这里插入图片描述

使用这种模式可以非常容易检查实参是否是适当的类型,转换它并在它的类型不正确时返回false,而且这些操作全部在同一个表达式中
当你检查过类型并拒绝了null值,编译器就确定了变量otherp的类型是person并让你相应地使用它

非空断言:"!!"

非空断言是kotlin提供的最简单的处理可空类型值的工具。
它使用双感叹号表示,可以把任何值转换成非空类型。如果对null值做非空断言,则会抛出异常,如下图

在这里插入图片描述

注意异常抛出的位置是非空断言所在的那一行,而不是接下来使用值的那一行

当你使用!!并且它的结果是异常时,异常调用栈的跟踪信息只表明异常发生在哪一行代码,而不会表明一场发生在哪一个表达式。为了让跟踪信息更清晰表示哪个值为null,不要在同一行使用多个非空断言

let函数

它让处理可空表达式变得更容易。和安全调用运算符一起,它允许你对表达式求值,检查求值结果是否为nul,并把结果保存为一个变量。所有的这些动作都在同一个简洁的表达式中。可空参数最常见的一种用法就是被传递给一个接收非空参数的函数。而let函数做的所有事情就是把一个调用它的对象变成lambda表达式的参数。结合安全调用语法,它能有效地把调用let函数的可空对象,转变成非空类型

在这里插入图片描述

如上图,不使用let函数的情况下必须显式检查这个值不为null

在这里插入图片描述

在这里插入图片描述

let函数只在email的值非空时才会被调用,所以你能在lambda中把email当作非空实参使用

用it简化代码

在这里插入图片描述

如果有一些很长的表达式结果不为null,而你又要使用这些结果时,let表示法很方便,这种情况下不必创建一个单独的变量。当你需要检查多个值是否为null时,可以用嵌套的let调用来处理,但大多数情况下这种代码又啰嗦又难理解,用普通if来一次性检查更好

延迟初始化的属性:lateinit

kotlin通常要求你在构造方法中初始化所有的属性,如果某个属性是非空类型,你就必须提供非空的初始化值,否则你就必须使用可空类型,但若果这么做,该属性的每一次访问都需要null检查或者!!运算符

为了解决这个问题,我们可以使用lateinit修饰符,把属性声明成可以延迟初始化的

在这里插入图片描述

在这里插入图片描述

注意!延迟初始化的属性都是var,因为需要在构造方法外修改他的值,而val属性会被编译成必须在构造方法中初始化的final字段。尽管该属性是非空类型,但你不需要在构造方法中初始化它。如果在属性被初始化之前就访问它就会异常。

lateinit属性常见的一种用法是依赖注入,在这种情况下,lateinit属性的值是被依赖注入框架从外部设置的。为了保证和各种java依赖注入框架的兼容性,kotlin会自动生成一个和lateinit属性具有相同可见性的字段。

可空类型的扩展

为可空类型定义扩展函数是一种更强大的处理null值的方式。可以允许接收者为null的扩展函数调用,并在该函数中处理null,而不是在确保变量不为null之后再调用它的方法,只有扩展函数能做到这一点,普通成员方法是通过对象实例分发的,因此实例为null时成员方法永远不能运行。如String库中的isEmpty就是这样。

在这里插入图片描述

input是可空类型的值,inNullOrBlank是可空类型的扩展。此处不需要安全访问,可以直接调用为可控接收者声明的扩展函数,这个函数会处理可能的null值

在这里插入图片描述

最后一行的第二个this使用了智能转换

当你为一个可空类型定义扩展函数时,你可以对可空的值调用这个函数,并且函数体中的this可能为null,所以你必须显式地检查。在java中this永远是非空的,因为它引用的是当前你所在这个类的实例。而在kotlin中,在可空类型的扩展函数中,this可以为null。我们之前讨论的let函数也能被可控的接收者调用,但它并不检查值是否为null。如果你在一个可空类型上直接调用let函数而不使用安全调用运算符,lambda的实参将会是可空的。因此,如果想使用let来检查非空的实参,你就必须使用安全调用运算符"?."

类型参数的可空性

kotlin中所有泛型类和泛型函数的类型参数默认都是可空的。任何类型,包括可空类型在内,都可以替换类型参数。这种情况下,使用类型参数作为类型的声明都允许为null,尽管类型参数T没有用问号结尾

在这里插入图片描述

要使类型参数非空,必须要为它指定一个非空的上界

在这里插入图片描述

注意!当你定义自己的扩展函数时,需要考虑该扩展是否需要为可空类型定义。默认情况下应把它定义成非空类型的的扩展函数。如果发现大部分情况下需要在可空类型上使用这个函数,你可以稍后再安全修改它。

可空性和java

当kotlin和java混用时,根据java类型的注解,java类型会在kotlin中表示为可空类型和非空类型
@Nullable + Type = Type?
@NotNull + Type = Type

平台类型

平台类型本质上就是kotlin不知道可空性信息的类型,既可以把它当作可空类型处理,也可以当作非空类型处理。这意味着你要像在java中一样对你在这个类型上做的操作负有全部责任。如果你认为这个值为null,使用前可以和null作比较,不认为它是null,就直接使用,若错误理解则会导致空指针

Type = Type? or Type

对于公有的kotlin函数,编译器会生成对每个非空类型的参数和接收者的检查,所以使用不正确的参数的调用尝试都会立即被报告为异常

在kotlin中不能声明一个平台类型的变量,这些类型只能来自java代码

继承

在kotlin中重写java的方法时,可以选择把参数和返回类型定义成可空的,也可以选择定义成非空的。在实现java类或者接口的方法时一定要搞清楚它的可空性,因为方法的实现可以在非kotlin的代码中被调用,kotlin编译器会为你声明的每一个非空的参数生成非空断言

Kotlin学习笔记 三-kotlin可空性与字符串操作 kotlin学习笔记三kotlin可空性安全调用操作符 ?非空断言操作符 !!非空断言操作符 ?:三级目录 kotlin可空性 安全调用操作符 ? a?.函数 如果为空 则函数不执行 一般为该对象的自带函数 可以瀑布式调用 a?函数1?.函数2 let 除了自带函数 还想做一些额外操作 例如对本对象操作,或者进行网络请求 a.?let{ //操作 } 虽然也可以if else 判断 但是安全调用操作符更加方便,简洁,例如支持瀑布调用。以后尽量使用操作符。 非空断言操作符 !! 非空断言操作 阅读详情

相关推荐

Kotlin 模块 6:空安全(Kotlin 核心特性)

Kotlin的空安全机制通过类型系统区分可空和非空类型,从根本上减少空指针异常(NPE)。核心特性包括:默认非空类型需显式声明可空性,安全调用运算符(?. )实现链式判空,Elvis表达式(?: )提供空值兜底。同时提供智能类型转换和as?安全类型转换等特性,将空值检查从运行时提前到编译期。开发者应避免滥用非空断言(!! ),合理使用安全调用和判空机制,才能充分发挥Kotlin空安全的优势,显著提升代码健壮性。

郭宝的博客 130

Kotlin 语言学习(6) - Kotlin 的可空性

一、本文概要 二、可空性 2.1 可空类型 当我们在声明方法时,如果允许在这个方法被调用的时候传给它null的实参,则需要显示地在类型名称后面加上问号来标记它: 问号可以加在任何类型的后面来表示这个类型的变量可以存储null引用,而所有常见类型默认都是非空的,除非显示地把它标记为可空。 当你有一个可空类型的值,对它的操作也会受到限制: 不能调用它的方法 不能把它赋值给非...

蒙的博客 963

Android开发进阶:深度解析Kotlin可空类型的设计哲学与实践

Kotlin可空类型系统:空指针问题的现代解决方案 摘要:Kotlin通过创新的可空类型系统从根本上解决了空指针异常问题。其核心机制包括:类型系统的二元划分(非空类型与显式标记的可空类型)、智能类型推导、平台类型处理策略,以及安全调用操作符(?.)、Elvis操作符(?:)等专用语法。这些设计将空值检查从运行时前移至编译时,大幅提升代码安全性。

郑伟强dev的专栏 120

Kotlin - 可空类型

在声明变量的时候,就要指定它是Nullable可空类型 还是Non-Null非空类型。默认为非空类型,即该变量不会为null,为null报错。 声明 Non-Null 非空类型: val a :String = "你好" val b :String = null //赋值为null报错:Null can not be a value of a non-null type String 声明 Nullable 可空类型: val c :String? = null val d = c...

HugMua的博客 2105

技术解析:ChangeFormer——基于Transformer的孪生网络在遥感变化检测中的创新应用

本文深入解析了ChangeFormer模型在遥感变化检测中的创新应用,该模型基于Transformer架构和孪生网络(Siamese Network),显著提升了变化检测的精度和效率。通过详细的技术实现和实战经验分享,展示了其在建筑物变化、森林监测等场景中的卓越表现,为相关领域的研究和应用提供了有力工具。

weixin_29102619的博客 496

Golang面试(一)莉莉丝游戏-Golang后端开发-中台部门

莉莉丝游戏-Golang后端开发-中台部门 开场白,双方自我介绍,对方介绍这个岗位情况,erlang语言,全部转向go。 聊项目,介绍IM架构以及使用Go写的服务简介 动态扩容相关问题:平常30万,现在100万,你们现在是如何应对的? 如果让你调整架构实现动态扩容,你会怎么做?回答了kafka,是一种,应该还要使用docker和k8s以及微服务框架等 如果使用kafka,你是如何确保消息有序?回答了redis,好像没回答到那个点 消息发送失败的问题,如何做到消息不丢?回答持久化存储、拉消息和ACK 发送失

xmcy001122的专栏 3899

教你如何完全解析Kotlin中的类型系统

简述: 已经很久没有更新文章,这大概是2019年第二篇文章了,有很多小伙伴们都在公众号留言说是不是断更了、是不是跑路了。在这里统一回复下我还好,并没有跑路哈,只是在思考接下来文章主要方向在哪? 如何在提升自己的同时可以帮助他人,以及这段时间也在不断认清自己和了解自己,发现自己哪里不足以及如何及时地查漏补缺。下面进入正题: Kotlin类型系统其中涉及到一个很重要的概念就是大家常说的可空性以及为什...

Mikyou的专栏 1906

别怕,“卷积”其实很简单

首先给大家讲一个关于卷积的小故事:小明是杭州某互联网大厂的员工,每天996十分辛苦,但小明最近爱上了打台球,经常不在工位。这天,小明的主管让小明改一个需求,小明却到楼下找产品部小丽打台球去了,被主管发现,他非常气愤,扇了小明一巴掌(注意,这就是输入信号,脉冲)。于是小明脸上会渐渐地(贱贱地)鼓起来一个包,小明的脸就是一个系统,而鼓起来的包就是小明的脸对巴掌的响应。好,这样就和信号系统建立起来意义对应的联系。

Machine Learning with Tutors 3181

Kotlin学习篇(4)—— Kotlin的类型系统

目录5. Kotlin的类型系统5.1 可空性5.1.1 可空类型5.1.1.1 : ?5.1.1.2 :安全调用运算符 ?.5.1.1.3 :Elvis运算符 ?:5.1.1.3 :安全转换 as?5.1.1.4 :非空断言 !!5.1.1.5 :“ let ”函数5.1.2 延迟初始化的属性5.1.3 可空类型的扩展5.1.4 参数类型的可空性5.1.5 可空性和java5.2 基本数据类型和其他数据类型5.2.1 基本数据类型: Int, Boolead 及 其它。5.2.2 可空的基本数

haazzz的博客 883

计组实验4 控制冒险与分支预测

目录前言实验内容背景知识分支预测技术⭐阻塞周期计算方法不开启 BTB开启 BTBpart 1 矩阵乘法与优化未开启 BTB 的分析开启 BTB 的分析part 2 设计代码使 BTB 无效part 3 循环展开优化矩阵乘法未开启 BTB开启 BTB结束语结论 前言 上一篇博客:计组实验3 mips冒险之流水线冒险 摸了半个月了。。。咕咕咕 今天来写计组实验 4 这个实验非常简单,就是有点难。 这个实验比较容易算错,或者是被模拟器出人意料的结果搞的神神叨叨的,所以今天来记录并且详细分析该实验。 注:请务必阅

AKGWSB 's blog 5667

Win11+Ubuntu18.04+Ubuntu20.04三系统安装与卸载

以下情况均为个人情况:1.插入启动 U 盘后,登录时可以按F12(拯救者Y7000,不同电脑不同)进入BIOS,选择从启动盘启动。2.。3.5.在win基础上,安装第一个Ubuntu系统后,系统启动界面类似如下第一张图,Ubuntu不显示版本号。安装第二个Ubuntu系统后,系统启动界面如下第二张图,如果想更改启动项的名称,可自行查阅相关资料。

weixin_61686291的博客 2537

《Kotlin实战》-第06章:Kotlin的类型系统

《Kotlin实战》-第06章:Kotlin的类型系统

crazyf2015的博客 668

DETR系列文章之–Co-DETR

Co-DETR,并行训练多个辅助头,以一对多的标签分配方式进行监督从辅助头中提取正样本坐标,为解码器中的正样本的训练效率进行额外的定制化正样本query.一对一标签分配:每个GT框分配给一个特定的query(DETR),较少的正query导致低效训练,从编码器生成的潜在表示和解码器中的注意力学习分析这一问题。一对多标签分配:每个GT框分配给检测器输出的多个proposal/anchor,依赖NMS或者anchor生成(ATSS,RetinaNet,FCOS,PAA)。

weixin_43731232的博客 2106

Kotlin中的可空性解读

参数传入可空性 可空性是kotlin类型系统为了避免发生NullPointerException错误的特性. 如下一段java代码 /*Java*/ int strLen(String s){ return s.length(); } 复制代码如果调用的时候我们这样去调用strLen(null), 这样一定会抛出NullPointerException. 下面我们用kotlin来改造它 ...

weixin_33935505的博客 411

【MCU】一种基于RTOS的无应答重发机制

文章目录一、背景描述二、结构框图三、基于RTOS的信号量的实现(3-1)思路描述(3-2)步骤(3-2-1)定义超时重发信号量(3-2-2)定义发送线程入口(3-2-3)定义接收线程入口四、基于定时器的实现(4-1)思路描述(4-2)步骤(4-2-1)创建定时器(4-2-2)定义定时器超时处理函数(4-2-3)定义发送线程入口(4-2-4)定义接收线程入口 一、背景描述 ​ 在微控制器之间进行数据通信时,大多需要添加无应答重发机制,以增强数据交互和通信的稳定性。 在使用UART通信的双方设备,当一次数据传输

iriczhao的博客 1523

uniapp [全端兼容] - 最新详细实现拍摄视频录像并可播放预览视频,调起本机摄像头开启录像录制完毕后保存到本机临时存放,可对拍摄的视频进行压缩处理减少文件大小不损失画质,详解录制视频并读取播放!

uni-app,h5移动端网页,微信小程序,支付宝小程序,Android安卓,苹果ios,app,nvue,录视频,拍视频,拍摄录制视频后上传服务器,调起摄像头录视频并可预览,录视频上传,录像,uniapp录制视频并上传,录制视频并保存到本地设备,如何本地保存并播放预览,提供给用户观看MP4视频录像并上传到后端服务器完整功能源码,视频压缩,mp4文件,删除视频,录像后怎么预览,临时视频文件怎么减少压缩大小,视频压缩及上传,自己录视频并生成可播放的文件,录视频并能打开查看,视频压缩后上传,本机相册,录完怎么预

🏆 前端领域优质创作者 1万+

Kotlin基础——类型系统

对于如下Java函数,可传递null或者值为null的String而在Kotlin中,如下函数不能传递null或值为null的String,否则会在编译期报错,保证了永远不会在运行时报空指针异常。

松仔Log的博客 1091

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

Kotlin教程(四)可空性

系列文章的知识点会以《Kotlin实战》这本书中顺序编写,在将书中知识点展示出来同时,我也会添加对应的Java代码用于对比学习和更好的理解。 Kotlin教程(一)基础 Kotlin教程(二)函数 Kotlin教程(三)类、对象和接口 Kotlin教程(四)可空性 [Kotlin教程(五)类型] [Kotlin教程(六)Lambda] 这一章实际上在《Kotlin实战》中是第六章,...

Hubert的博客 847

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

第6章Kotlin的类型系统

第6章Kotlin的类型系统

yipiziyoudelang的博客 472

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Kotlin系列之类型可空性

作为一个程序员,最常见的问题恐怕就是NPE了吧,有时候即使很小心的编码,还是避免不了出现NPE,在Kotlin中,它力争把这个在运行时常常出现的问题在编译器解决掉,让我们写出更加健壮不易崩溃的代码。 Java的类型系统存在的问题 在说kotlin之前,我们先谈谈Java中的类型系统。什么是类型呢?通俗来讲其实就是对所有我们要表示的数据确定一个具体的分类。 比如,我们把12这个数据分为int这个分类...

写代码的林克 995

androidsdk最新版本_在 Android 11 及更高版本系统中处理可空性

作者 / David Winer, Kotlin 产品经理在去年 5 月的 I/O 开发者大会上,我们正式宣布 Kotlin 优先 (Kotlin First) 的这一重要理念,Kotlin 将成为 Android 开发者的首选语言。目前,在排名前 1,000 位的 Android 应用中,已有超过 60% 正在使用 Kotlin 进行开发。为什么 Kotlin 受到这么多开发者的喜爱呢?这里就不...

weixin_39719727的博客 560

聊一聊泛型的可空性 (kotlin)

什么?泛型本身也可以是nullable?上来就抛这么个问题实在是不够友好~ 首先回顾,什么是泛型?Oracle Java Tutorials Introduced in J2SE 5.0, this long-awaited enhancement to the type system allows a type or method to...

weixin_34384557的博客 1511

Kotlin 语言学习(7) - Kotlin 的类型系统

一、本文概要 二、基本数据类型和其它基本类型 2.1 基本类型:Int、Boolean 及其它 Java把基本数据类型和引用类型做了区分: 基本数据类型,例如int的变量直接存储了它的值,我们不能对这些值调用方法,或者把它们放到集合中。 引用类型的变量存储的是指向包含该对象的内存地址的引用。 Kotlin不区分基本数据类型和引用类型,它使用的永远是一个类型(例如Int),此外,你还能...

蒙的博客 490

四、kotlin的可空性和基本数据类型

是一种可以为 的类型, 本质是下面这样: 作用 在不影响程序运行性能的前提下, 显示的帮助程序员避免空指针异常 在java中这样容易出现空指针异常 在实际的java项目, 都需要 判断 当然 之后出现的 , 但还是麻烦的, 不仅使代码变得冗长而且还存在性能问题 使用 kotlin 重写这个函数前需要程序员主动判断该函数是否接受实参为空的情况, 如果需要支持的话, 在上面代码中, 如果 为 的话, 则该函数直接返回 , 函数调用者 可以借助返回值 使用 判断是否为空如果实参一定不为

bangiao的博客 806
上一篇: 【Kotlin学习】Lambda编程——序列、使用Java函数式接口、with和apply函数
下一篇: 【Kotlin学习】Kotlin的类型系统——基本数据类型和其他基本类型、集合与数组
Panic  Lin
博客等级 码龄6年 81粉丝 64原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值