CentOS 8用户管理:adduser、wheel组与sudo权限安全实践

CentOS 8 用户管理:从 adduser/userdel 到 wheel 组与 sudo 权限闭环 Linux 用户管理是操作系统权限体系(AAA:认证、授权、审计)的基础实践,其核心在于用户身份与权限策略的精准绑定。在 CentOS 8 这一广泛用于教学、嵌入式及遗留生产环境的 EOL 发行版中,`adduser` 与 `userdel` 并非简单增删账号,而是触发 PAM 认证、shadow 密码数据库更新、sudoers 策略加载及 setuid 机制激活的关键操作。尤其 `wheel` 组作为 RHEL/CentOS 系列提权的强制入口,与 `sudo` 的 setuid 位共同构成权限提升的物理 阅读详情

1. 项目概述:在 CentOS 8 中安全、可控地管理用户账户

“Добавление и удаление пользователей в CentOS 8”——这句俄语标题直译是“在 CentOS 8 中添加和删除用户”,但它背后承载的远不止两条命令的语法。作为一名从 RHEL 5 时代就开始部署生产服务器的系统运维老兵,我见过太多因用户管理失当引发的事故:误删关键服务账户导致数据库集群离线;新同事被赋予过宽权限后误操作清空日志分区;临时测试账户长期滞留未清理,成为渗透链路的跳板;甚至有团队把 root 密码写在共享文档里,只因“adduser 太麻烦”。CentOS 8 虽已进入 EOL(生命周期终止)阶段,但其用户管理体系——尤其是基于 adduser / useradd 、 userdel 、 sudo 和 wheel 组 的权限分层模型——仍是当前主流 Linux 发行版(如 Rocky Linux 8/9、AlmaLinux 8/9、RHEL 8/9)的基石。你搜索的热词如 vm安装centos 8 、 sudo属于root并设置了setuid位 、 用户加入wheel组和vi sudoers区别 ,恰恰印证了这个基础操作在真实工作流中的高频与高危特性。它不是教科书里的练习题,而是每天都在发生的权限治理实践。本文不讲抽象理论,只聚焦一个目标:让你在虚拟机或物理服务器上,用最稳妥的方式完成用户增删,确保每一步都可审计、可回滚、权限最小化。适合刚配好 vm安装centos 8 环境的新人,也适合想厘清 sudo 权限底层逻辑的中级运维——比如你是否真正理解为什么 sudo 命令必须由 root 拥有且 setuid 位被设置?为什么直接编辑 /etc/sudoers 是高危操作,而 usermod -aG wheel username 才是标准答案?接下来的内容,全部来自我过去十年在金融、电商、政企客户现场踩过的坑和验证过的方案。

2. 用户管理的核心设计逻辑与方案选型依据

2.1 为什么不用 useradd 而推荐 adduser ?一条命令背后的用户体验哲学

在 CentOS 8 的 man 手册里, adduser 和 useradd 被明确标注为“同一程序的符号链接”。表面上看, useradd john 和 adduser john 效果完全一致。但实际使用中,二者的行为差异巨大,这种差异不是 bug,而是 Red Hat 工程师刻意为之的设计哲学。 useradd 是一个纯粹的底层工具,它只做最核心的事:修改 /etc/passwd 、 /etc/shadow 、 /etc/group 这三张“用户户籍表”,创建家目录(如果加 -m 参数),复制 /etc/skel 骨架文件。它不问你密码强度、不提醒你设置 shell、不帮你配置家目录权限。而 adduser 是 useradd 的一个封装脚本,它内置了一套面向人类的操作流程。当你执行 adduser alice 时,系统会自动:

  1. 创建用户 alice ,UID 自动分配(避开系统保留 UID 1–999);
  2. 强制创建家目录 /home/alice ,并递归设置权限为 700 (仅属主可读写执行);
  3. 将 /etc/skel 下所有文件( .bashrc , .bash_profile , .vimrc 等)完整复制进去;
  4. 启动交互式密码设置流程,要求你输入两次密码,并进行基础强度校验(至少8位,含大小写字母和数字);
  5. 自动为该用户指定默认 shell /bin/bash ;
  6. 如果系统启用了 SELinux(CentOS 8 默认开启),还会自动为家目录打上正确的 user_home_t 上下文标签。

提示:你可以用 which adduser 和 which useradd 验证它们指向同一二进制文件,再用 ls -l /usr/sbin/adduser 查看其文件属性——它是一个指向 useradd 的符号链接。真正的魔法在 /usr/sbin/adduser 脚本的源码逻辑里,它调用 useradd 时预置了大量 -m 、 -s /bin/bash 、 -c "Full Name" 等参数。这就是为什么我们坚持说“ adduser 是给运维人用的, useradd 是给自动化脚本用的”。

我曾在一个银行核心系统迁移项目中,因脚本错误使用了裸 useradd 而未加 -m 参数,导致新用户登录时家目录不存在, ~/.ssh/authorized_keys 无法加载,SSH 公钥认证全线失效。故障排查花了整整两小时,最后发现根源竟是家目录没创建。从此,我的所有初始化脚本里, adduser 前面都加了注释:“此处严禁替换为 useradd,除非你已手动处理家目录、shell、SELinux 上下文”。

2.2 wheel 组 vs 直接编辑 /etc/sudoers :权限管控的“高速公路”与“手挖隧道”

热词里反复出现的 用户加入wheel组和vi sudoers区别 ,是新手最容易混淆的权限管理误区。很多教程会教你打开 /etc/sudoers 文件,找到 # %wheel ALL=(ALL) NOPASSWD: ALL 这一行,去掉前面的 # 号,然后保存。这看起来很直接,但风险极高。 /etc/sudoers 是一个语法极其严格的配置文件,一个多余的空格、一个漏掉的逗号、一个未闭合的引号,都会导致整个 sudo 系统崩溃。一旦出错,你将无法再用 sudo 执行任何命令,包括修复这个文件本身——因为 visudo 命令本身也需要 sudo 权限来启动。此时,你只能重启进入单用户模式,手动挂载根文件系统并编辑,这对线上服务器是不可接受的停机。

而 wheel 组机制,则是 Red Hat 官方推荐的、经过充分验证的“安全通道”。它的设计逻辑是: 权限授予 = 组成员身份 + 预定义策略 。CentOS 8 默认在 /etc/sudoers 中已存在如下策略:

%wheel  ALL=(ALL)       ALL

这行配置的意思是:“所有属于 wheel 组的用户,在任意主机上,可以以任意用户(包括 root)身份,执行任意命令”。它没有 NOPASSWD ,意味着每次执行 sudo 都需要输入自己的密码——这本身就是一道重要的安全确认环节。你只需执行一条简单、原子、可逆的命令:

sudo usermod -aG wheel alice

-aG 参数是关键: -a 表示“append”(追加), -G 表示“groups”,即把用户 alice 追加到 wheel 组,而不影响她已有的其他组成员身份。这条命令只会修改 /etc/group 文件中 wheel 组的成员列表,操作极轻量,几乎不可能失败。即使你误操作, gpasswd -d alice wheel 也能瞬间撤销。

注意: usermod -aG 是唯一安全的追加方式。如果你写成 usermod -G wheel alice (少了 -a ),系统会把 alice 从所有其他组(比如 users 、 docker )中踢出去,只保留在 wheel 组。这可能导致她无法访问某些共享目录或 Docker 守护进程,引发连锁故障。我在某次政务云平台升级中就遇到过,一位开发人员被误删出

CentOS 8 用户管理:从 adduser 到 sudo 权限闭环实战 Linux 用户管理不仅是创建账号的基础操作,更是 UID/GID 身份体系与 sudoers 策略控制的深度协同。其核心原理在于:有效用户 ID(EUID)是否为 0,取决于组成员身份(如 wheel 组)与 /etc/sudoers 中精确匹配的命令授权规则双重校验。这一机制直接决定权限能否生效,也解释了 'sudo: user is not in the sudoers file' 和 'effective user id is not 0' 等高频报错的根源。技术价值体现在最小权限落地、生产环境安全 阅读详情

相关推荐

CentOS 8用户管理实战:adduser/userdel原理、wheel组权限与visudo安全配置

Linux用户管理是系统安全与权限控制的基础能力,涉及UID/GID分配、主目录初始化、shell环境加载、SELinux上下文设置及sudo权限继承等核心机制。在CentOS 8中,adduser与useradd的行为差异远超交互式与否——前者自动处理骨架文件复制、权限设定和SELinux标签,后者则需显式参数保障一致性;userdel的-r选项存在NFS挂载误删、符号链接跟随等高危风险;wheel组作为sudo权限的事实载体,其有效性依赖visudo语法校验与最小权限白名单设计。本文聚焦生产环境真实故障

bk_lin的专栏 450

CentOS 7 用户管理:从 adduser 到 sudo 的权限闭环实践

Linux 用户管理是操作系统安全与权限控制的基础概念,其核心涵盖用户创建、密码策略、组权限继承及特权提权四大原理。技术价值在于实现最小权限原则、审计可追溯性与系统边界隔离,广泛应用于虚拟化环境(如 VMware CentOS 7)、生产服务器加固、CI/CD 权限管控及离线运维场景。本文聚焦 CentOS 7 环境下 adduser 命令的交互式安全机制与 sudo 的 setuid 本质,解析 /etc/passwd、/etc/shadow、/etc/sudoers 等关键文件的协同作用,揭示密码复杂度

457

CentOS 8 创建 sudo 用户:wheel 组、setuid 权限与安全审计

sudo 是 Linux 系统中实现特权提升的核心机制,其本质是通过 setuid 位赋予普通用户临时 root 权限的能力;在 CentOS 8 中,该机制深度绑定 wheel 组策略与 /usr/bin/sudo 文件的 setuid 属性(-rwsr-xr-x),任何对组成员关系、文件权限或所有者(必须为 root)的破坏都会导致 'effective uid is not 0' 等底层报错;这种设计强化了最小权限原则和可审计性,广泛应用于生产环境权限管理、Jetson Nano 等嵌入式设备运维及自

weixin_30487201的博客 386

CentOS 8 sudo用户配置原理:setuid机制与wheel组授权详解

sudo 是 Linux 系统中实现权限提升的核心工具,其本质依赖内核级 setuid 机制——当普通用户执行设置了 setuid 位的 /usr/bin/sudo 时,进程的有效用户ID(effective UID)被临时提升为 root(UID=0),从而获得高权限执行能力。这一机制需与应用层的 sudoers 配置协同工作,典型如 %wheel 组授权规则,决定谁可执行哪些命令。理解该原理对解决 'effective uid is not 0'、'not in the sudoers file' 等高

weixin_34335458的博客 541

CentOS 8 创建 sudo 用户:wheel 组、setuid 与 visudo 深度指南

sudo 是 Linux 系统中实现特权命令执行的核心机制,其本质依赖 setuid 位赋予普通进程临时 root 权限,并通过 /etc/sudoers 及其分片文件(如 /etc/sudoers.d/)定义细粒度访问策略。在 RHEL/CentOS 8 中,权限模型已从传统 sudo 组迁移至 wheel 组驱动的 PolicyKit 协同治理体系,要求用户必须加入 wheel 组、确保 /usr/bin/sudo 具备 rws 权限、并通过 visudo 进行语法安全的策略编辑。该机制支撑 DevOp

weixin_30500105的博客 411

CentOS 8 sudo用户创建与权限管理深度指南

sudo 是 Linux 系统中实现特权提升的核心机制,其本质是通过 setuid 位赋予普通进程临时 root 权限,并依赖 /etc/sudoers 配置文件与 PAM 认证模块协同完成权限校验。在 CentOS 8 中,该机制深度集成 SELinux 上下文、wheel 组策略及 secure_path 环境隔离,技术价值在于支撑最小权限原则、审计合规与自动化运维。典型应用场景包括虚拟机部署(如 VirtualBox/VMware 安装 CentOS 8)、DevOps 用户授权、CI/CD 脚本执行

weixin_34056162的博客 434

CentOS 8 创建带sudo权限的普通用户最佳实践

在Linux系统中,普通用户通过sudo机制获得临时特权是权限管理的核心范式。其原理基于setuid机制与PAM认证链协同工作,确保命令执行时有效用户ID(EUID)动态提升并受审计约束。该技术显著降低root账户滥用风险,提升系统可追溯性与合规性,广泛应用于生产服务器、虚拟化开发环境(如VMware/VirtualBox)及自动化运维场景。本文聚焦CentOS 8原生安全体系,深入解析wheel组的SELinux上下文继承、pam_wheel模块联动等关键机制,并结合密码策略强制落地、sudo日志闭环验证

weixin_30764883的博客 484

CentOS 8 新建 sudo 用户的完整流程与 PAM 权限修复

sudo 是 Linux 系统中实现权限提升的核心机制,其本质依赖 setuid 位、PAM 认证链和 sudoers 策略三者协同。在 CentOS 8 中,用户加入 wheel 组仅是授权起点,真正生效还需显式启用 pam_wheel.so 模块并校准 requiretty 策略——这与 Ubuntu 的开箱即用模式存在根本差异。该机制保障了最小权限原则落地,支撑自动化运维、CIS 基准合规及审计溯源需求。典型应用场景包括虚拟机部署(如 VirtualBox/Vagrant)、云服务器初始化、Ansib

weixin_34161032的博客 420

CentOS 8 sudo用户创建失败原因与PAM权限机制详解

sudo 是 Linux 系统中实现特权提升的核心机制,其本质是基于 PAM(可插拔认证模块)的动态认证流程,而非简单的配置文件授权。在 CentOS 8 中,sudo 权限不再由 /etc/sudoers 单独控制,而是依赖 pam_wheel.so 模块对 wheel 组成员的身份校验、/etc/pam.d/sudo 的规则顺序,以及用户会话上下文三者协同生效。理解这一‘认证前置’原理,能避免常见错误如 ‘sudo: command not found’ 或 ‘user not allowed to e

weixin_33868027的博客 388

Halcon实战:如何快速找到图像中的多个圆并计算圆心距离(附完整代码)

本文详细介绍了Halcon在工业视觉检测中快速定位图像中的多个圆并计算圆心间距离的实战方法。通过两种核心算法(阈值分割和动态阈值)的对比分析,结合完整代码示例和参数调优技巧,帮助开发者高效解决多圆检测问题,提升工业检测精度与效率。

weixin_33701251的博客 315

生物信息学名词解释 | K-mer (长度为k的短序列)

K-mer 何谓K-mer 所谓Kmer,即为一段长度为k的DNA片段,是由测序reads剪切一部分得到的。k为一个奇数,k=几,就为几mer。 比如:我的测序reads长度为100bp,我将这100bp打断成17bp的短片段,打断后的17bp段片段就叫17mer,可以获得(100-17+1)条k-mer序列。 Table1 k-mers for GTAGAGCTGT. k k-mers 1 G,T,A,G,A,G,C,T,G,T 3 GTA,TAG,AGA,GAG,AGC,GCT,CT

qq_50637636的博客 2万+

磁感应强度B、磁场强度H、矢量磁位A的study

学完电磁场很久了但是对电磁场中磁感应强度B⃗\vec{B}B、磁场强度HHH、矢量磁位A⃗\vec{A}A,这几个变量所表征的含义一直很模糊,所以就总结了一下

sinat_42386289的博客 1万+

拯救者R9000P-2021-AMD5800H黑苹果EFI配置与优化指南

本文详细介绍了在联想拯救者R9000P 2021款(搭载AMD锐龙7 5800H处理器)上安装和优化黑苹果系统的完整指南。内容涵盖EFI配置、OpenCore引导设置、关键驱动(如NootedRed核显驱动)的调整,以及安装后的性能调优与常见问题解决,旨在帮助开发者和极客用户在这款游戏本上搭建稳定可用的macOS开发环境。

weixin_29291069的博客 281

从零构建PEMFC仿真模型:MATLAB/Simulink中的模块化拆解与系统集成

本文详细介绍了如何在MATLAB/Simulink环境中从零构建质子交换膜燃料电池(PEMFC)仿真模型,包括电化学模型、气体供应系统和热管理系统的模块化实现。通过多物理场耦合技巧和系统集成策略,帮助工程师和研究者高效开发PEMFC控制策略,优化性能并实现实时仿真。

weixin_29294975的博客 357

5.3-集群电源模式解析

DSU-120 DynamIQ™集群支持9种电源模式,包括正常运行(ON)、完全断电(OFF)、三种数据保持模式(FUNC_RET、FULL_RET、MEM_RET)、两种调试模拟模式(OFF_EMU、MEM_RET_EMU),以及系统恢复模式(WARM_RST、DBG_RECOV)。这些模式通过智能管理电源状态,在保持数据完整性的同时实现功耗优化,并为系统调试和故障恢复提供支持。不同模式在RAM保持、逻辑断电和调试能力方面各有侧重,满足从正常运行到深度调试等不同场景需求。

baron-周贺贺-代码改变世界ctw 116

【AI应用实战-WorkBuddy】WorkBuddy 能帮你做什么(一)

文章摘要: WorkBuddy是一款AI工作助手,专为提升效率而设计,适用于经常处理文档、代码、数据分析等重复性任务的职场人士。它能通过自然语言交互快速完成五大核心场景任务: 周报撰写:输入工作要点,10分钟生成专业周报; 代码调试:解析报错信息,3分钟提供解决方案; Excel分析:自动计算数据趋势并生成图表和结论; 自动化脚本:将重复流程转为脚本,节省98%时间; 文档生成:根据代码自动补充README、API文档和注释。 效果对比:传统手动操作耗时1-3小时的任务,WorkBuddy可将时间缩短至10

342

MicroCap声学仿真介绍(一)

5-频率上下限选择,需要注意的是,第一个数字是上限,第二个数字是下限,如果填反了,会有报错提示;下三角可以选择“Auto”、“linear”、“log”和“list”,设置的是频率点之间的距离和频率点的数量。Component是用来选择部件的模块,如上图所示,声学仿真常用到的是“Electroacoustic Macros AC”、“Electroacoustic Macros TR”、“NXP Transducers”以及“NXP HD components”。3是声学部件,是声学仿真中常用的部件。

山无忧的博客 5084

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

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

上一篇: Ubuntu 18.04 swap配置指南:fallocate与mkswap实战详解
下一篇: CentOS 8 用户管理:useradd/usermod/userdel 底层原理与安全实操
hidetobj
博客等级 码龄19年 15粉丝 301原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值