理解SSH的加密与连接过程

SSH2协议加密与连接过程 最近在做ssh2联动交换机模块,看到libssh2-1.9.0版本对于用户认证有三种不同的方式: ① password(默认)②keyboard-interactive ③ publickey 看代码并不是太理解,所以查询了一番,SSH2通信大致分为两步,以下是对通信过程的简单理解: 生成共享秘钥(加密通道): 1. 客户端先向服务器发起TCP连接。 2. 服务器回复自己所支持的SSH... 阅读详情

理解SSH的加密与连接过程

提供:ZStack社区

前言

SSH(secure shell“安全的壳”)是一种安全协议,是管理远程服务器最常用的方式。通过一系列的加密技术,SSH在两个端点之间建立起加密连接,在每个端点上验证另一端,并在两端之间传输命令。

我之前的其他文章中介绍过如何配置SSH密钥,如何建立SSH连接,以及一些SSH的使用技巧。今天,我将介绍SSH底层的加密技术,介绍SSH是如何使用这些技术建立安全连接的。本文内容涉及各层的加密方式,建立连接的步骤,以及端与端之间验证的方式。

对称加密、非对称加密与哈希

针对信息传输的保护,SSH采用了多种数据处理办法,包括对称加密、非对称加密、以及哈希的数种方案。

对称加密(Symmetrical Encryption)

用于加密数据的组件和用于解密数据的组件,两者之间的关联性决定了该种加密方式是对称型的还是非对称型的。

对称加密采用同一个密钥加密和解密数据。也就是说,任意两个持有同样密钥的人就可以在相互之间传递加密信息并解密。

该种加密方式常被称为“共同的秘密(shared secret)”式加密或者“秘密的钥匙(secret key)”式加密。通常情况下,所有的操作都使用同一个密钥,或者一对关联度非常高、使得接收方能够很容易的推断出发送方使用的密钥的密钥对。

SSH使用对称密钥为整个连接过程加密。众所周知的公钥/私钥(public/private)是非对称密钥对,然而它们仅仅用于身份验证的过程,而没有用在传输过程。对称加密可以保护密码验证过程不受嗅探(snooping)的威胁。

该对称密钥由客户端与服务器端共同创建,生成的密钥不告知任何第三方。创建密钥的过程涉及一个密钥交换算法(key exchange algorithm),使用该算法时,客户端和服务器端根据共享的部分公共数据加上指定的秘密数据分别独立生成同样一个密钥(下文将详细介绍这个过程)。

该过程创建的对称加密密钥是基于会话(session)的,负责对服务器和客户端之间传输的数据进行加密。创建后,其余的所有数据传输都会经过该密钥的加密。这个过程在认证客户端之前执行。

SSH可以配置不同的对称加密法(symmetrical cipher system),包括AES、Blowfish、3DES、CAST128、以及Arcfour。服务器和客户端都可以选择其使用的加密法,最终使用的加密法一般由机器上加密法列表的排序决定:客户端加密法列表上出现的第一个服务器端也支持的加密算法,将用于双方加密传输的实现。

Ubuntu 14.04的默认列表顺序如下(客户端和服务器端通用):aes128-ctr、aes192-ctr,aes256-ctr、arcfour256、arcfour128、aes128-gcm@openssh.com、aes256-gcm@openssh.com、chacha20-poly1305@openssh.com、aes128-cbc、blowfish-cbc、cast128-cbc、aes192-cbc、aes256-cbc、arcfour。

也就是说,如果是两台Ubuntu 14.04之间进行数据传输,则它们总会使用aes128-ctr加密算法(除非做过另外的配置)。

非对称加密(Asymmetrical Encryption)

非对称加密的发送与接收需要使用两个密钥,这两个密钥是相互关联的,一个叫做私钥(private key),另一个叫做公钥(public key)。

公钥可以共享给其他人,仅仅持有公钥是无法推导出私钥的。从数学的实现上,公钥加密的信息仅仅可以由私钥解密(而不能由公钥自己解密),私钥加密的信息也不能用公钥解密。这是一个单向的过程。

私钥必须要严格保密,不可与其他人共享。私钥的保密是整个加密范式安全性的关键。该范式假设:持有私钥是解密的唯一方式。如果一台主机能够解密由公钥加密过的信息,这只能表示它掌握着对应的密钥。

SSH在以下几个节点采用了非对称加密。首先是一开始建立用于连接的对称加密时的密钥交换过程(key exchange)。在这一阶段,服务器和客户端都各自生成了临时的公钥/私钥对,以计算出同一个用于连接加密的共享密钥。

其次是广为人知的SSH身份验证过程。SSH密钥对用于让服务器验证一个客户端的身份。密钥对在客户端上生成,其中的公钥上传至远程服务器,保存在~/.ssh目录下一个叫做authorized_keys的文件里。

安全连接建立后,服务器就会触发身份验证过程。服务器会用其文件里的公钥加密一条信息发给客户端,如果客户端能够解密出正确的信息,则证明了它持有对应的私钥,然后服务器才会对该客户端开放自己的环境。

哈希(Hashing)

SSH还使用了另一种叫做密码哈希函数(cryptographic hashing / cryptographic hash functions)的数据处理技术。密码哈希函数可以为一组信息创建一个简明的“签名”(也可以说是一段摘要),这个签名是独一无二的,而且理论上没有任何方法可以从这个签名反向推导出原来的信息内容。

同样的信息,同样的哈希函数,应生成同样的哈希结果(hash);对信息稍微做一点更改,就会生成完全不同的哈希结果。从设计上,用户不能通过一个哈希推断出信息原文,但是可以根据信息原文生成的哈希推断出该信息是否与指定的某条信息完全一致。

基于上述特性,哈希常用于数据完整性的检测以及通讯身份验证。SSH中常用的哈希叫做HMAC,即“基于哈希的信息验证代码(hash-based message authentication codes)”,此类代码用于确保接收的信息内容与发送的信息内容完全一致。

在上文提到的对称加密过程中,SSH会选择一个信息验证码(MAC,message authentication code)的算法,具体是何种算法取决于客户端与服务器端上的算法列表次序,即客户端算法列表上出现的第一个服务器端也支持的算法。

加密连接建立后,每一条发送的信息都会包含一个MAC,这样接收方就能够用这个MAC来验证信息完整性。MAC的计算过程使用了共享密钥、信息包的顺序代号、以及信息自身的内容。

在内容发送过程中,MAC是在每一个信息包的最后发送的,位于对称加密区之外。这是因为根据科研人员的建议,最好按照先加密、后计算MAC的顺序进行数据的处理。

SSH的工作过程

你大概已经对SSH的工作过程有过一些简单的了解。SSH协议采用C-S(客户端-服务器端)架构进行双方的身份验证以及数据的加密。

服务器端组件监听指定的端口,负责安全连接的建立、对连接方的身份认证、以及为通过身份认证的用户建立正确的环境。

客户端负责发起最初的TCP握手、安全连接的建立、验证服务器的身份与之前记录中的一致、并将自己的验证信息提供给服务器。

一个SSH会话的建立过程分为两个阶段。第一阶段,双方沟通并同意建立一个加密连接通道以供后续信息传输用。第二阶段,对请求接入的用户进行身份验证以确定服务器端是否要给该用户开放访问权限。

共同建立加密通道

当客户端发起TCP连接时,服务器端返回信息说明自己支持的协议版本,如果客户端上支持的协议与之匹配,则连接继续。服务器会提供自己的公共主机密钥(public host key)以让客户端确认自己访问的是正确的机器。

然后,双方采用一种Diffie-Hellman算法共同为该会话建立密钥。每一方的一部分私有数据,加上来自对方的一部分公共数据,通过这种算法计算,能够得出完全相同的密钥用于本次会话。

整个会话的通讯内容都使用该密钥进行加密。这个阶段使用的公钥/私钥对与用户验证身份用的SSH密钥是完全无关的。

经典Diffie-Hellman算法的计算步骤如下:

  1. 双方共同选择一个大值素数作为种子值(seed value)
  2. 双方共同选择一个加密生成器(通常是AES),用于后续的数值操作
  3. 双方分别各自选择一个素数,该素数的值对对方保密,用于生成本次通讯的私钥(与SSH身份认证私钥无关)
  4. 双方分别用各自的私钥、共同的加密生成器、和共同的素数生成各自的公钥
  5. 双方将各自的公钥共享给对方
  6. 双方用各自的私钥和对方发过来的公钥生成另一个密钥。根据该算法,双方各自计算出来的两个密钥是完全一样的,即“共同的秘密”
  7. 该密钥被用于本次通讯所有内容的加密

这个共享密钥的加密方式被称为二进制数据包协议(binary packet protocol)。该过程能够让双方平等的参与密钥生成的过程,而不是由单方掌握。这种共享密钥生成的过程是安全的,双方没有交换过任何未经加密的信息。

生成的密钥是对称式密钥,一方用于加密信息的密钥等同于另一方用于解密信息的密钥,而任何第三方由于不持有该密钥,是无法解密双方传递的内容的。

会话加密通道建立后,SSH开始进入用户认证阶段。

服务器认证用户以开放访问权限

下一步,服务器验证用户身份以决定是否准许其访问。验证有不同的方式,选择的验证方式取决于服务器的支持。

最简单的验证是密码验证:服务器要求客户端输入密码,客户端输入的密码经过上述的通道加密传输给服务器。

虽然密码是加密过的,然而该方法仍然不被推荐,因为用户经常为了省事而使用过于简单的密码,而这类密码很容易就能够被自动化脚本破解。

最流行的验证方式是SSH密钥对,这也是当前最推荐的方式。SSH密钥对是非对称密钥,私钥和公钥分别用于不同的功能。

公钥用于加密,而私钥用于解密。公钥可以随意上传、共享,因为公钥的流通并不会危及到私钥的保密性。

SSH密钥对的验证过程起始于上一部分加密通道建立之后,其具体执行步骤如下:

  1. 客户端发送自己的密钥ID给服务器端
  2. 服务器在自己的authorized_keys文件中检查是否有此ID的公钥
  3. 如果有,则服务器生成一个随机数,用该公钥加密之
  4. 服务器将加密后的随机数发给客户端
  5. 客户端用私钥解密该随机数,然后在本地为随机数做MD5哈希
  6. 客户端将该MD5哈希发给服务器端
  7. 服务器端为一开始自己生成的随机数也做一个MD5哈希,然后用通讯通道“公共的密钥”将该哈希加密,再跟客户端发来的内容进行对比。如果双方内容一致,则通过验证,开放访问权限给客户端

简单来说,服务器端用公钥加密信息,客户端用私钥解密信息以证明自己持有私钥。该过程同时使用了对称加密和非对称加密,两种方式各有自己的功用。

总结

了解SSH建立连接、进行信息加密的方式,有助于我们理解在登陆远程服务器的过程中都发生了什么。希望在阅读本文之后,你对于其中涉及的组件和算法有了更深入的认识。

本文来源自DigitalOcean Community。英文原文:Understanding the SSH Encryption and Connection Process by Justin Ellingwood

翻译:lazycai

SSH的工作原理、加密方式以及配置多个ssh key 本文从SSH工作原理、加密方式开始探究,引出多主机配置ssh连接的密钥选择问题,继续分析ssh_config配置,配以示例配置,干货满满。 阅读详情

相关推荐

计算机网络基础 | 图解SSH原理

本文目录 初见SSH SSH工作原理 SSH实践 总结 1.远程Server收到Client端用户TopGun的登录请求,Server把自己的公钥发给用户。 2.Client使用这个公钥,将密码进行加密。 3.Client将加密的密码发送给Server端。 4.远程Server用自己的私钥,解密登录密码,然后验证其合法性。 5.若验证结果,给Client相应的响应。 1.Client将自己的公钥存放在Server上,追加在文件authorized_keys中。 2.Server端接收到Client

迈微AI研习社 · 号主 695

ssh远程访问及控制

本文介绍ssh协议的概念和工作原理、ssh命令的基本用法、还有如何使用密钥实现免交互验证登录等,希望对你有帮助

十七拾的博客 2457

8、深入解析SSH协议:从版本选择到安全认证

本文深入解析了SSH协议的核心机制,包括协议版本选择、参数协商、密钥交换以及服务器认证等关键步骤。通过详细的流程分析,揭示了SSH如何保障远程连接的安全性,为用户和管理员优化SSH连接提供了理论支持和实践指导。

dropout6artist的博客 71

006_ssl监测及评分

https://testssl.sh/ 一、 https://www.ssllabs.com/ssltest/analyze.html?d=jyall.com 监测下jyll.com,不忍直视啊! 二、 https://myssl.com/dns_check.html#dns_check 实用工具箱 转载于:https://www.cnblogs.com/itcomp...

weixin_30656145的博客 263

掌握网络通信安全:实验室手册阅读总结

本文介绍了在Windows环境下使用Secure Copy(SCP)进行文件传输,并通过Wireshark捕获SSH会话的过程。文章详细阐述了安装和配置WinSCP的步骤,以及如何捕获并分析网络通信中的SSH会话,以确保数据传输的安全性。此外,文章还探讨了使用证书和SSL来保护网络通信的过程,并说明了证书的配置和作用。

weixin_42551310的博客 434

【codex教程】Codex 注册和使用教程(2026最新版)

Codex 是 OpenAI 推出的 AI 编程助手,可以帮助开发者阅读代码、修改代码、运行命令、生成测试、排查 bug、做代码审查,也可以在终端、IDE、Codex App 或网页端使用。根据 OpenAI 帮助中心,截至 2026 年 6 月,Codex 已包含在 Free、Go、Plus、Pro、Business、Edu 和 Enterprise 等 ChatGPT 方案中,但不同套餐的使用额度会有所不同。适合开发者在终端中使用。如果你想在命令行里使用 Codex,可以安装 Codex CLI。

与时俱进,开放共享 2万+

SSH加密的两种方式

第一种方式为密码登录 在整个过程中,客户端本身不存有任何密钥。 过程: 客户端输入用户名,发出登陆请求 服务端接收到请求并返回给客户端公钥以及公钥指纹 客户端收到服务端发送的公钥,对自己的登陆密码用公钥进行加密然后将密文发送给服务端 服务端收到密文后,使用自己的私钥将密文进行解密,得到客户端的登陆密码并对比确认 服务端返回给客户端,登陆结果 第二种方式为公钥登陆,也就是免密登陆 在...

zhh_1998的博客 4419

麒麟V10(arm)配置本地离线yum源

麒麟V10(arm)配置本地离线yum源

myfm2java的博客 7892

SSH连接调试:逐行解读SSH -vvv的输出信息

使用ssh -vvv调试SSH连接不仅可以让我们了解SSH连接的内部机制,还能在排查问题时提供有价值的信息。希望通过本文的逐行解读,你能更好地理解SSH连接中的各个环节。这样的信息对于了解SSH的连接机制和故障排查都是非常有用的。希望这篇文章能让你更好地理解SSH连接背后的细节。

十年运维开发经验的王义杰在此分享自己的知识和经验 3588

基于ESP32-C3的便携式血氧仪硬件与算法实现

血氧饱和度(SpO₂)监测是生理参数无创检测的核心技术之一,其原理基于光电容积脉搏波(PPG)信号中红光与红外光吸收比值的动态变化。该技术依赖高精度模拟前端、稳定光学激励及实时数字信号处理能力,在消费级健康设备中面临功耗、体积与测量鲁棒性的多重约束。ESP32-C3凭借集成LEDC、12位ADC与低功耗双核架构,成为PPG终端的理想主控平台;结合定制化指夹式光学探头与比率法血氧算法,可实现非诊断级但趋势可靠的日常健康监测。本文围绕硬件电路设计、电源管理策略与嵌入式信号处理流程展开,覆盖从LED驱动、跨阻放大

weixin_29025501的博客 132

Ego-Planner实战避坑指南:从环境搭建到仿真运行

本文详细介绍了在Windows系统下,通过WSL2搭建Ego-Planner无人机路径规划算法开发环境的完整流程与实战避坑指南。内容涵盖ROS Noetic安装、第三方依赖库(如Ceres Solver)编译冲突解决、Realsense SDK版本降级处理,以及Gazebo仿真与真机调试的常见问题,旨在帮助开发者高效完成环境配置并成功运行仿真。

weixin_29232507的博客 700

SSH协议介绍

SSH协议介绍 SSH概念介绍 SSH是一种网络协议,我们常说的 ssh 一般指其实现,即 OpenSSH,在 shell 中,也就是 ssh 命令。 Secure Shell(安全外壳协议,简称SSH)是一种加密的网络传输协议,可在不安全的网络中为网络服务...

weixin_30314631的博客 176

用blender为模型贴图并在gazebo中显示

用blender为模型贴图并在gazebo中显示 首先我用的是最新的blender2.92版本,附上链接https://www.blender.org/download/。并设置好简体中文。语言可以在编辑->偏好设置->界面里面设置。 首先界面右上角的摄像头,方块,灯光三个场景全都删除。 接着导入stl格式的模型文件,下面以tianbot_mini上面的激光雷达的模型为例。 导入激光雷达模型后,点击进入上方的UV Editing按钮进入UV编辑界面 此时我面看见网格化的激光雷达模型

qq_48427527的博客 8001

kali linux ssh不要密码登录密码,kali linux 登录ssh服务常见问题

kali linux 登录ssh服务常见问题kali linux 登录ssh服务常见问题kali linux 登录ssh服务常见问题一、ssh简介1、层次2、ssh解决问题二、服务器发送了一个意外的数据包三、ssh服务器拒绝了密码一、ssh简介??SSH 为Secure Shell的缩写,由IETF的网络小组(Network working Group)所制定,SSH为建立在应用层基础上的安全协议...

weixin_39999730的博客 785

Multisim14.0仿真应用设计(十六)74LS138译码器应用仿真

74LS138为3线-8线译码器。

zhusl6688的博客 2983

在ubuntu20.04中安装MATLAB时常见问题及解决方法

   如果你刚装完ubuntu20.04,这时你想要安装MATLAB2021A,在输入命令./install进行安装时,可能会报以下错误:    terminate called after throwing an instance of ‘JailContainerException’ what(): Error: 88: No JRE version parsed from/media/jzx/MATHWORKS_R2021A/sys /java/jre/glnxa64/jre/release   

慕羽★的博客 1万+

SCP免密传输和SSH登录流程详解

SCP免密传输和SSH登录协议详解 在linux下开发时,经常需要登录到其他的设备上,例如虚拟机内ubuntu、树莓派等等,经常涉及到传输文件的操作,传输文件有很多中方法,如物理磁盘拷贝,基于网络的samba服务、SCP传输、ftp文件传输等等,今天我们就来聊聊出场频率最高的SCP传输。 SCP的使用 在linux环境中,当我们需要在两台机器之间传输数据时,经常会用到SCP指令,(SCP...

did59261的博客 1395

【牛客算法】小美的数组删除

本文分析了小美数组删除问题的解法,提出了一种逆向遍历求MEX的优化算法。该算法通过从数组末尾开始遍历,逐步构建子数组集合,利用MEX的单调性和增量更新特性,在O(n)时间复杂度内计算所有可能删除方案的最小代价。关键设计包括:1)逆向遍历实现MEX状态继承;2)利用HashSet快速判断元素存在;3)动态比较删除前j个元素和删除整个子数组的代价。算法空间复杂度为O(n),适用于大规模数据。代码实现简洁高效,已被验证为同类问题的最优解之一。

字节卷动 1340

TSL SSL SSH Openssl Openssh 区别

SSL : secure sockets layer , 一种国际标准的身份认证与加密协议。 SSH: secure Shell. 加密的shell,基于SSL协议的用来替代telnet 协议, Openssl: ssl 协议的C语言开源实现 Openssh: ssh 协议的C语言开源实现。 TSL: TLS(传输层安全)是更为安全的升级版 SSL。由于 SSL 这一术语更为常用,因此我们仍然将我们的安全证书称作 SSL。 ...

u013804856的博客 915

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

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

RSA加密算法,从实际应用到基础原理(一)

RSA加密算法,从实际应用到基础原理

mashiqing的博客 1645

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

【无标题】

ssh是linux系统中的一个远程连接工具,也是一种网络协议,通过各种加密算法达到安全连接的效果。若能使用ssh连接到另外一台机器上,我们就可以认为是安全的。本节主要介绍的是ssh连接的原理以及ssh免密连接的原理。 一、ssh连接原理 1、环境介绍 两台linux服务器 分别安装ssh服务,并启动 2、原理以及过程  在A上使用ssh连接B机 A向B发送连接请求 B收到请求后,将自己的公钥发给A\nA收到公钥后,用公钥加密B的登陆密码,生成加密密文,发送给B B收到加密密文后,用自己的

weixin_63755737的博客 760

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Linux 攻防快速入门(上)-SSH 远程访问的流程

SSH(Secure Shell)是 Linux/Unix 系统上常用的远程访问协议,通过加密通道保证用户身份验证和数据传输的安全。客户端可以是 Terminal、Xshell、Putty 等工具,服务端一般是sshd。

rasssel的博客 304

linux(CentOS版本)学习笔记4

1.配置centos服务器 在网上下载centos-minimal版本,然后按照安装正常centos的方法安装,成功后应该会进入到一个非图形界面。注意这里我们只设置root账户就可以了,不用创建其他的账户了,因为我们已经有了linux基础。 查看IP信息的命令:ip addr和ifconfig 2.对称加密和非对称加密,SSH协议 对称加密:采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的...

weixin_43684054的博客 245

RHCE 作业2

无

m0_56763594的博客 312

探讨SSH协议参数优化与内网穿透技术整合提升远程连接过程

探讨SSH协议参数优化与内网穿透技术整合提升远程连接过程

wei_shuo的博客 1万+

SSH连接服务器的原理理解

SSH连接服务器的连接流程,涉及到非对称密钥的加解密功能。

小丑鱼的专栏 3092
上一篇: Docker生态系统:常规组件简介
下一篇: 如何利用Graphite、StatsD与CollectD实现数据追踪与统计
普通网友
博客等级 码龄10年 769粉丝 269原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值