如何在Adapter中优雅的使用Context

如何在Adapter中正确的使用Context 前言 最近我在项目中,发现一个同事写 RecyclerView.Adapter 的时候都习惯定义一个全局的私有 mContext,然后在 onCreateViewHolder(parent: ViewGroup, viewType: Int) 方法中进行赋值操作 mContext = parent.context。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Wzo0BlR5-1611468169753)(#pic_center)] 第一次见到这样的写法, 三种方式 阅读详情

如何在Adapter中优雅的使用Context

 

1. 前言

最近我在项目中,发现一个同事写 RecyclerView.Adapter 的时候都习惯定义一个全局的私有 mContext,然后在 onCreateViewHolder(parent: ViewGroup, viewType: Int) 方法中进行赋值操作 mContext = parent.context。

如下:

class MyAdapter(private val dataList: List<MyData>) : RecyclerView.Adapter<MyAdapter.MyViewHolder>() {
    private lateinit var mContext: Context

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
    	//在这里进行context的赋值
        mContext = parent.context
        val view = LayoutInflater.from(parent.context).inflate(R.layout.rcy_item_view, parent, false)
        return MyViewHolder(view)
    }

    override fun getItemCount(): Int {}

    override fun onBindViewHolder(holder: MyViewHolder, position: Int) {}
}

如何在Adapter中优雅的使用Context

 

WT,还可以这么操作!!第一次见到这样的写法,有点意思,由此有了这一篇文章。

2. 获取到 Context 的四种方式

很多时候我们需要在 RecyclerView.Adapter 中使用到 context,比如:利用 Glide 来加载网络图片的时候。

如何在Adapter中优雅的使用Context

 

这时,我们该如何拿到 context 给 Glide 呢?

2.1 通过 Adapter 构造函数传入 Context

这是我之前最常用的一种方式,通过 Adapter 构造函数将当前Activity Context传进来,如下:

class MyAdapter(
    private val context: Context,
    private val dataList: List<MyData>
) : RecyclerView.Adapter<MyAdapter.MyViewHolder>() {

    class MyViewHolder(val binding: RcyItemViewBinding) :
        RecyclerView.ViewHolder(binding.root) {
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
        val binding = RcyItemViewBinding.inflate(
            LayoutInflater.from(parent.context),
            parent,
            false
        )
        return MyViewHolder(binding)
    }

    override fun getItemCount(): Int = dataList.size

    override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
        val data = dataList[position]
        holder.binding.apply {
            Glide.with(context).load(data.imageUrl).into(holder.binding.imageIv)
            holder.binding.contentTv.text = data.content
        }
    }
}

2.2 通过 Parent.context 获取

这个也是文章开头中提到的我的同事的一种写法,如下:

class MyAdapter(private val dataList: List<MyData>) :
    RecyclerView.Adapter<MyAdapter.MyViewHolder>() {

    private lateinit var mContext: Context

    class MyViewHolder(val binding: RcyItemViewBinding) :
        RecyclerView.ViewHolder(binding.root) {

    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
        mContext = parent.context
        val binding = RcyItemViewBinding.inflate(
            LayoutInflater.from(parent.context),
            parent,
            false
        )
        return MyViewHolder(binding)
    }

    override fun getItemCount(): Int = dataList.size

    override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
        val data = dataList[position]
        holder.binding.apply {
            Glide.with(mContext).load(data.imageUrl).into(holder.binding.imageIv)
            holder.binding.contentTv.text = data.content
        }
    }
}

2.3 通过 onAttachedToRecyclerView() 方法获取

对于2.2 的方法,通过 parent.context 对 mContext 进行赋值,有人说,不可以这么操作!这样会导致内存泄露!!(留个疑问?你觉得2.2方法这样操作会导致内存泄漏吗?) 所以你需要覆写 onAttachedToRecyclerView(recyclerView: RecyclerView) 方法,在这里对 mContext 进行赋值。如下:

class MyAdapter(private val dataList: List<MyData>) :
    RecyclerView.Adapter<MyAdapter.MyViewHolder>() {

    private lateinit var mContext: Context

    override fun onAttachedToRecyclerView(recyclerView: RecyclerView) {
        super.onAttachedToRecyclerView(recyclerView)
        mContext = recyclerView.context
    }

    class MyViewHolder(val binding: RcyItemViewBinding) :
        RecyclerView.ViewHolder(binding.root) {

    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
        val binding = RcyItemViewBinding.inflate(
            LayoutInflater.from(parent.context),
            parent,
            false
        )
        return MyViewHolder(binding)
    }

    override fun getItemCount(): Int = dataList.size

    override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
        val data = dataList[position]
        holder.binding.apply {
            Glide.with(mContext).load(data.imageUrl).into(holder.binding.imageIv)
            holder.binding.contentTv.text = data.content
        }
    }
}

2.4 通过 ImageView 获取 context

当当就我们举的这个例子,因为我们需要用到 Glide 来展示网络图片,所以我们需要传递 Context 给 Glide,其实我们可以直接通过 ImageView 来拿到 context,然后传给 Glide,如下:

class MyAdapter(private val dataList: List<MyData>) :
    RecyclerView.Adapter<MyAdapter.MyViewHolder>() {

    class MyViewHolder(val binding: RcyItemViewBinding) :
        RecyclerView.ViewHolder(binding.root) {

    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
        val binding = RcyItemViewBinding.inflate(
            LayoutInflater.from(parent.context),
            parent,
            false
        )
        return MyViewHolder(binding)
    }

    override fun getItemCount(): Int = dataList.size

    override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
        val data = dataList[position]
        holder.binding.apply {
            Glide.with(imageIv.context).load(data.imageUrl).into(holder.binding.imageIv)
            holder.binding.contentTv.text = data.content
        }
    }
}

3. 问题的本质

上面介绍了四种方法来获取 Context,想必大家都想弄清楚上面几种方法有什么区别吧,那我们就打印他们获取到的 context 出来瞧瞧看吧,如下:

class MainActivity : AppCompatActivity() {

    private lateinit var binding: ActivityMainBinding
    
    ···
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        Log.e("jctest", "onCreate: this::class.java = ${this::class.java}")
        Log.e("jctest", "onCreate: binding.recyclerView.context::class.java = ${binding.recyclerView.context::class.java}")
        val adapter = MyAdapter(listData)
        binding.recyclerView.adapter = adapter

    }

    class MyAdapter(private val dataList: List<MyData>) :
        RecyclerView.Adapter<MyAdapter.MyViewHolder>() {

        class MyViewHolder(val binding: RcyItemViewBinding) :
            RecyclerView.ViewHolder(binding.root) {

        }

        override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
            Log.e("jctest", "onCreateViewHolder: parent::class.java = ${parent::class.java}")
            Log.e("jctest", "onCreateViewHolder: parent.context::class.java = ${parent.context::class.java}")
            val binding = RcyItemViewBinding.inflate(
                LayoutInflater.from(parent.context),
                parent,
                false
            )
            return MyViewHolder(binding)
        }

        override fun getItemCount(): Int = dataList.size

        override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
            val data = dataList[position]
            holder.binding.apply {
                Log.e("jctest", "onBindViewHolder: imageIv.context::class.java = ${imageIv.context::class.java}")
                Glide.with(imageIv.context).load(data.imageUrl).into(holder.binding.imageIv)
                holder.binding.contentTv.text = data.content
            }
        }

        override fun onAttachedToRecyclerView(recyclerView: RecyclerView) {
            super.onAttachedToRecyclerView(recyclerView)
            Log.e("jctest", "onAttachedToRecyclerView: recyclerView.context::class.java = ${recyclerView.context::class.java}")
        }

    }

}

打印出来的 Log 如下:

E/jctest: onCreate: this::class.java = class com.jc.test.MainActivity
E/jctest: onCreate: binding.recyclerView.context::class.java = class com.jc.test.MainActivity
E/jctest: onAttachedToRecyclerView: recyclerView.context::class.java = class com.jc.test.MainActivity
E/jctest: onCreateViewHolder: parent::class.java = class androidx.recyclerview.widget.RecyclerView
E/jctest: onCreateViewHolder: parent.context::class.java = class com.jc.test.MainActivity
E/jctest: onBindViewHolder: imageIv.context::class.java = class com.jc.test.MainActivity

通过 Log,真的就一目了然了,这四种方法虽然看着写法很不一样,但是其获取到的 context 其实都是同一个,那就是 MainActivity。

我们再来看看这四个方法:

  • 2.1 通过 Adapter 构造函数传入 this,这很明显,就是 MainActivity。
  • 2.2 通过 Parent.context 获取,通过 Log 我们可以知道,parent 就是 recylerView,所以获取的是 recyclerView 运行于的上下文,也就是 MainActivity。
  • 2.3 通过 onAttachedToRecyclerView() 获取,也是获取 recyclerView 运行于的上下文,即 MainActivity。
  • 2.4 通过 ImageView 获取,获取的是 ImageView 运行于的上下文,ImageView 是运行于 recyclerView 上的,所以获取的也是 MainActivity。

3.1 到底应该怎么用呢?

刚刚,我们通过打印 Log 知道了这四种方法获取到的 Context 其实都是同一个,那~~,这四种方法又该如何来取舍呢?到底用哪一种方法比较好呢?

文章开头中,我说 2.1 是我之前最常用的一个方法,那我现在为什么不用它了呢??

原因很简单,那就是因为之前我不知道可以直接在 Adapter 内部直接获取到 Context ,既然可以在类内部直接获取到的参数,完全就没有必要再写一个参数从外部导入,这样会让代码看着更加的简洁。

还记得文章中留的那个疑问吗 -> 有人说通过 2.2 parent.context 方法获取 context 会导致内存泄漏,你认同吗?

该写法不会导致内存泄漏,但是我也不推荐这样的写法,毕竟 onCreateViewHolder() 方法的执行次数是由 itemCount 所决定的,所以也就意味着 mContext = parent.context 也会执行 itemCount 次,明明一次就行,其它多余的操作,会造成不必要的开销。

那通过 onAttachedToRecyclerView() 方法,只会进行一次赋值操作,很OK啊,但毕竟他又是定义全局变量,又是覆写方法,太麻烦了,我们可以在简单一点。

3.2 我选择的方式

好像我把前面介绍的方法都给否认了,那我现在是怎么用的呢?还是以上面的例子,如下:

class MyAdapter(private val dataList: List<MyData>) :
    RecyclerView.Adapter<MyAdapter.MyViewHolder>() {

    class MyViewHolder(
        private val context: Context,
        private val binding: RcyItemViewBinding
    ) :
        RecyclerView.ViewHolder(binding.root) {

        fun bind(data: MyData) {
            Glide.with(context).load(data.imageUrl).into(binding.imageIv)
            binding.contentTv.text = data.content
        }
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
        val binding = RcyItemViewBinding.inflate(
            LayoutInflater.from(parent.context),
            parent,
            false
        )
        return MyViewHolder(parent.context, binding)
    }

    override fun getItemCount(): Int = dataList.size

    override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
        holder.bind(dataList[position])
    }
}

我选择在 onCreateViewHolder() 通过 parent.context 方法获取 context,但是,不是赋值给全部变量 mContext,而是直接传给 ViewHolder 作为一个私有变量供其使用。

4. 总结

文章中的看法都是我自己的个人观点,毕竟对于一个方法的好坏,就看你站在什么角度看待它,我并没有认为我的方法是最好的最值得推荐的,从而要求大家也这么写。相反,写这篇文章,纯粹就是觉得很有意思,因为文章中的介绍的这几种方法都是我身边出现的,我特想知道大家是用什么方式的呢?欢迎大家留言与我一起讨论。

最后

在这里我也分享一份由几位大佬一起收录整理的 Flutter进阶资料以及Android学习PDF+架构视频+面试文档+源码笔记 ,并且还有 高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料……

这些都是我闲暇时还会反复翻阅的精品资料。可以有效的帮助大家掌握知识、理解原理。当然你也可以拿去查漏补缺,提升自身的竞争力。
如果你有需要的话,可以前往 GitHub 自行查阅。

Android Spinner 深度解析:Kotlin 开发中的状态管理与 Adapter 实践 Spinner 是 Android View 系统中实现单选弹出式状态选择的核心控件,其本质是封装了弹出逻辑、焦点管理与生命周期协同的轻量级菜单组件。它基于 AdapterView 架构,依赖 Adapter 模式解耦数据与 UI 渲染,通过 onItemSelectedListener 提供用户交互反馈。在 Kotlin 工程实践中,需特别关注协程作用域(如 lifecycleScope)与 UI 线程更新的时序安全、ArrayAdapter 与 BaseAdapter 的适用边界,以及 setSelec 阅读详情

相关推荐

Claude Code 适配国产大模型:协议网关与 Adapter 实战指南

Claude Code 并非普通 IDE 插件,而是一个深度耦合 Anthropic 专属协议的智能编程代理系统,其核心依赖 codex-server 的上下文切片、Tool Use 协议和 token 计费逻辑。当对接智谱 ZCode、DeepSeek 等国产大模型时,因 OpenAI 与 Anthropic API 格式、上下文估算方式、usage 字段定义等底层差异,直接修改 endpoint 必然失败。真正可行路径是构建本地协议转换网关,通过开源 codex-server-open 实现 Adapt

weixin_30340617的博客 459

applicationContext.xml详解

         想必用过Spring的程序员们都有这样的感觉,Spring把逻辑层封装的太完美了(个人感觉View层封装的不是很好)。以至于有的初学者都不知道Spring配置文件的意思,就拿来用了。所以今天我给大家详细解释一下Spring的applicationContext.xml文件。Ok,还是通过代码加注释的方式为大家演示:    以下是详解Spring的applicationCon...

梅阳博客 408

Agent Runtime 重构:从 Context Overflow 到 Session-Event-Log

Agent runtime 是支撑大模型智能体稳定运行的底层基础设施,其核心挑战在于状态管理、凭证安全与故障恢复。传统依赖模型 context window 存储会话状态极易引发静默截断与推理失真;而基于事件日志(Event Log)的持久化设计,将状态与计算解耦,实现会话可追溯、可恢复、可审计。该架构天然支持 credential vault 隔离、无状态 harness 弹性伸缩,并为可观测性与合规审计提供结构化数据基础。当前主流云厂商与 Anthropic 均正将 session-as-durable

闲谈 584

Android——RecyclerView入门学习之RecyclerView.Adapter

学习资料: 鸿洋大神为RecyclerView打造通用Adapter让RecyclerView更加好用鸿洋大神Android优雅的为RecyclerView添加HeaderView和FooterView 之前使用RecyclerView.Adapter,基本就类似套用公式,死步骤,对Adapter感到既熟悉又陌生。从去年我开始接触学习Android之时,RecyclerView已经开始大量

ChatHello的博客 2万+

android demo,BaseAdapter传递context的应用

android demo,BaseAdapter传递context的应用,

EDA虚拟机分享2020版本(Synopsys2020)

EDA虚拟机分享

亦安的数字小站 9190

adapter里获取context的方法

as

weixin_52110757的博客 899

AMD MI50 Linux ROCm 6.4 手动编译与大模型推理实战

GPU加速计算是现代AI推理的核心基础,其性能依赖于硬件架构、驱动栈与运行时环境的深度协同。ROCm作为AMD开源GPU计算平台,采用‘自下而上’的Linux生态集成路径,强调对上游内核、编译器与固件的强耦合。MI50基于Vega 20(gfx900)架构,虽具备32GB HBM2高带宽显存与14.7 TFLOPS FP16算力,但因ROCm官方支持策略转向CDNA架构,自6.5版本起被移出支持列表,仅ROCm 6.4仍提供实验性兼容——这使其成为Linux下部署私有大模型的关键‘最后一班船’。本文围绕MI

weixin_32770423的博客 369

如何在Adapter中优雅的使用Context,移动设备开发方向

private lateinit var mContext: Context override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder { //在这里进行context的赋值 mContext = parent.context val view = LayoutInflater.from(parent.context).inflate(R.layout.rcy_item_view, parent, fals

m0_66264938的博客 787

从实验室到生活:构建一份全面的手机相机主观画质评测指南

本文详细介绍了如何从实验室数据转向实际体验,构建全面的手机相机主观画质评测指南。通过基础装备清单、室内外场景实战评测及数据之外的感知艺术,帮助用户发现手机相机在色彩还原、动态范围和夜景模式等方面的真实表现。特别关注主观体验与客观参数的差异,提供实用的评测技巧和报告撰写心法。

weixin_30940783的博客 308

告别环境配置烦恼:用Conda一键搞定GATK4、samtools、fastp等生信分析全家桶

本文介绍如何利用Conda快速搭建包含GATK4、samtools、fastp等工具的生物信息学分析环境,解决软件安装和版本冲突问题。通过详细的配置步骤和实战案例,帮助研究者十分钟内完成重测序分析全家桶的环境配置,显著提升上游分析效率。

weixin_30753873的博客 334

Android app crash的问题排查思路与反思

做安卓开发总是伴随着不同的设备适配和不同的设备性能,同一套代码可能在Android5.0上跑着相安无事,但是在Android7.0上就有各种各样的问题,再加上安卓厂商众多以及良萎不齐的设备性能,如果没有经验,很容易就会采坑。如果是普遍的内存泄露问题,靠水磨工夫一点一点慢慢查还是能弄清楚的,但是总有些莫名其妙的问题,于是便有了本篇文章。 ...

我怀里的猫的博客 4383

ERDAS 2022与ArcGIS共存安装教程:如何避免端口冲突(详细配置步骤)

本文提供了一份详细的ERDAS 2022与ArcGIS共存安装教程,核心在于解决两者因FlexNet许可证服务器导致的端口冲突问题。通过分步指导,包括检查现有端口占用、修改ERDAS许可证文件端口号、配置防火墙及客户端设置,确保两款专业GIS与遥感软件能在同一系统上稳定运行。

weixin_29279047的博客 253

如何优雅的写代码——使用RecyleView的基类Adapter

使用基类是代码更清晰也更简单,就是容易看也容易写。平常写个Adapter可能又长又乱,现在可以这样写了: public class AppListAdapter extends RecycleVariableAdapter { public AppListAdapter(Context context, List data) { super(context, data)

安地Andy的博客 1217

实战!在 AMD RX 9070 XT (16G) 上使用原生 Windows ROCm 7.1 部署 ComfyUI + Z-Image-Turbo

本文详细介绍了如何在Windows系统下为AMD Radeon RX 9070 XT显卡配置Z-Image-Turbo AI绘图环境。主要内容包括:安装VS Build Tools和最新显卡驱动,配置Conda Python 3.12环境,安装ROCm 7.1.1 SDK及PyTorch适配版本,部署ComfyUI可视化界面。重点解决了AMD显卡在AI绘图中的适配问题,通过--use-split-cross-attention参数优化显存使用,最终成功搭建了可在消费级16G显存设备上运行的AI绘图环境

qq_33614778的博客 4693

ARFoundation系列讲解 - 24 锚点

一、添加平面检测和平面可视化 请参考 ARFounnation快速入门-08平面检测 案例 二、添加射线检测 1.在AR Session Origin 组件上添加ARRaycastManager 脚本

a451319296的博客 4878

MCP Adapter 默认服务器深度解析:3 个元工具如何优雅破解『工具过载』难题

[![MCP Adapter 默认服务器与 WordPress Abilities 桥接示意图](https://raw.gitcode.com/gh_mirrors/mcp/mcp-adapter/raw/7896e69172c206e613370e018ef8c34f361b4630/.wordpress-org/banner-1544x500.png?utm_source=gitcode_r

gitblog_00342的博客 190

企业级AI平台架构设计:AI应用架构师的未来趋势

企业级AI平台是AI从“实验室”走向“生产线”的关键,而AI应用架构师就是这条“生产线”的总设计师。未来,随着生成式AI、边缘计算、自治式AI的发展,架构师的角色将越来越重要——他们不仅要构建技术平台,还要连接技术与业务,让AI真正创造价值。“不要做‘只会调模型的工程师’,要做‘能解决业务问题的架构师’。因为,真正有价值的AI,从来不是“最先进的模型”,而是“能落地、能复用、能创造业务价值的平台”。愿你在企业AI转型的浪潮中,成为那个“搭建桥梁的人”——连接技术与业务,连接现在与未来。

小程序开发 973

为RecyclerView打造通用Adapter 让RecyclerView更加好用

为RecyclerView打造通用Adapter 让RecyclerView更加好用

sdfwcc的博客 645

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

android ListView 优雅高效的adapter

public class SetAdapter extends ArrayAdapter { private List<SetData> _content; private final int _resourceId; private int _positionOnTouch = -1; private OnChangedTextListener...

weixin_30251587的博客 105

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

如何用 BlockSuite Adapter 与 ASTWalker 实现文档到 Markdown 的导入导出?

在 AFFiNE 的编辑器内核 BlockSuite 中,如果你需要把文档内容导出为 Markdown,或者把 Markdown 文件导入成 BlockSuite 文档,直接实现入口就是 Adapter API:它是不同数据格式与 BlockSuite `Snapshot`(JSON 序列化的块树)之间的桥梁。本文基于仓库内的 [Adapter 指南](https://link.gitcode.c

gitblog_00582的博客 484

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

Nexth高级功能:自定义Hooks与Context API实现Web3状态管理

想要快速构建生产级的Web3应用?Nexth作为一款基于Next.js + Ethereum的**Web3应用开发套件**,通过自定义Hooks和Context API提供了强大的**状态管理解决方案**。本文将深入探讨Nexth如何利用这些高级功能简化Web3开发流程,让您能够快速交付高质量的区块链应用。 ## 为什么Nexth的状态管理如此重要? 在Web3应用开发中,**状态管理**是核

gitblog_00139的博客 311

RxjavaRetrofitDemo完全指南:如何优雅实现Android网络请求架构

在Android开发中,网络请求是每个应用都绕不开的核心功能。面对复杂的网络交互、异步处理和错误处理,如何构建一个优雅、可维护的网络请求架构成为开发者必须掌握的技能。**RxjavaRetrofitDemo**项目正是为了解决这个问题而生,它展示了如何将Retrofit与RxJava完美结合,打造出简洁高效的Android网络请求解决方案。 ## 🚀 为什么选择RxJava + Retrofi

gitblog_00916的博客 888

MuleSoft大模型编排实战:企业级AI工作流架构设计

大语言模型(LLM)作为新兴智能引擎,其真正价值在于与企业核心系统深度协同,而非孤立调用。本文聚焦AI编排(AI Orchestration)这一关键范式,解析如何通过结构化上下文构建、提示词版本化管理、输出Schema强校验及多层降级机制,将不可控的黑盒推理转化为可审计、可追溯、可运维的确定性服务。结合MuleSoft Anypoint Platform的企业级连接能力与运行时治理能力,实现LLM与Salesforce、ServiceNow、SAP等异构系统的安全集成与合规联动,支撑金融风控、客户服务、订

keke1314520的博客 467
上一篇: 苦于技术没办法提升,年龄和工资没有成正比,我到底该怎么办?
下一篇: Android 直播中弹幕、带货和键盘的交互
懂你的大海
博客等级 码龄6年 9049粉丝 1381原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值