炼丹笔记干货 作者:时晴 困惑度(Perplexity)在NLP中是个最流行的评估指标,它用于评估语言模型学的到底有多好.但是很多炼丹师可能至今对"困惑度"依然感到困惑,这篇就把这个讲清楚.假设我们要做个对话机器人...那就是困惑度了,它衡量了模型对自己预估结果的不确定性.低困惑度说明模型对自己很自信,但是不一定准确,但是又和最后任务的表现紧密相关.然后它又计算起来非常简单,用概率分布就可以计算. 困惑度如何算?...低困惑度不能保证模型更好.首先,正如我们在计算部分所看到的,模型最糟糕的困惑度是由语言的词汇量决定的。...第二,也是更重要的一点,困惑和所有内部评估一样,不提供任何形式的理智检查,同困惑度的模型也是有好有坏的。...困惑度应用 当使用“困惑”来评估在真实世界数据集(如one billion word benchmark)上训练的模型时,可以看到类似的问题。
所以我刚刚使用Yum在新的CentOS 7服务器上安装了Apache.我之前已经多次安装过Apache,但我从未见过这样:当我现在运行ps aux时,它总是显示...
猜想3:163把邮件发到我们域名申请的DNS那儿,那儿再把邮件对Dormforce.net 下面的所有二级域名进行广播。 到底是怎么回事还不是很了解。有待解决。
作为一个后端开发者,想必对mysql是非常是熟悉了。下面来聊一聊mysql8.0的新特性。 临时表的改进 在MySQL5.7中,所有的临时表都被创建在一个叫“ibtmp1”的表空间中。...8.更快、性能更好的Schema和Information Schema 我们对Schema进行了许多改进,如假索引和直方图。
', value); } } registerOnChange(fn) { this.onChange = fn; } registerOnTouched(fn) { } 由于我们对用户是否与组件交互不感兴趣...在registerOnChange 里我们简单保存了对回调函数 fn 的引用,回调函数是由 formControl 指令传入的(译者注:参考 L85),只要每次 slider 组件值发生改变,就会触发这个回调函数
我们在示例代码中定义了接口,当数据发生变化的时候,采用接口的方式实现对页面的通知。...()方法对LiveData所包装的数据进行观察,当该数据发生变化的时候,就可以得到更新后的数据,并在onChanged()方法中做出处理。...四.LiveData的原理 为了更好地理解LiveData,我们可以深入LiveData.observe()方法的源码一探究竟。...五.LiveData.observeForever()方法 LiveData还提供了一个名为observeForever()的方法,它的用法和observe方法相似,主要的区别在于,当LiveData...因此,在用完之后,一定要记得调用removeObserver()方法来停止对LiveData的观察,否则LiveData会一直处于激活状态,Activity则永远不会被系统自动回收,这就造成了内存泄漏。
inflate.findViewById(R.id.tv_fragmentB).text = "fragmentb:${t}" }) 对...class TransMapViewModel: ViewModel() { fun sendData() { userLivedata.value=User("李白",1200)//对userLivedata...} : ${it.age}"//这里可以返回任意类型的数据 } } data class User(var name:String,var age:Int) 代码中 mapLiveData 是对...,处理 count 累加和是否回调 liveCombind 的功能 activity 中代码 model.liveCombind.observe(this){ logEE(it...对象,供我们注册监听 activity 中注册 livedata 监听 model.startAsyncWithSecond(3).observe(this){ logEE
} }); button.setOnClickListener(view -> { homeViewModel.addValue(); }); 在页面中,通过LiveData.observe...()对LiveData所包装的数据进行观察,我们也可以通过Livedata的postValue()或Livedata的setValue()来完成修改数据,postValue()用在非UI线程中,setValue...的原理 LiveData的observe()方法接收两个参数,第一个是LifecycleOwner,第二个是Observer,源码中Observer与Activity的生命周期关联在一起,因此,LiveData...还有一个observeForever(),和observe()没有太大区别,主要区别在于,当LiveData发生变化时,无论页面处于什么状态,都能收到通知。...因此,使用完以后一定要调用removeObserver()停止对LiveData的观察,否则会造成内存泄漏。
而要说清上述问题,即正是对LiveData的设计思想做一个阐述。...上述思路看着很繁琐,但其实比较简单,也即是 LiveData 的整个设计思路,但如果你理解 Lifecycle ,上述的理解我想对你来说,就是 so easy。...observe() 用于订阅LiveData的数据更新,源码如下: @MainThread public void observe(@NonNull LifecycleOwner owner, @NonNull...具体我们看一眼官方对其的描述: ---- 但既然 LiveData 这么安全好用,所以就会有开发者想着使用 LiveData 用于事件通知,此时它的设计在某种程度上就成了问题,虽然在官方的建议里,非常不建议直接这么用...因为在不谈的背景的情况下,没有绝对的标准与统一的准则,那就更别提对与错。但至少对于 LiveData 而言,了解完本篇的你,我相信再也不会再有相关疑问。
3、Room:ORM 数据库访问框架 4、WindowManager:加强对多窗口模式的支持 5、WorkManager:加强对后台任务的支持 6、Compose:新一代视图开发方案 ---- 1....注意: LiveData 内部会禁止一个观察者同时使用 observe() 和 observeForever() 两种注册方式。...但同一个 LiveData 可以接收 observe() 和 observeForever() 两种观察者。...return liveData; } } } 3.5 Kotlin Flow Google 对 Flow 的定位是 Kotlin 环境下对 LiveData 的替代品,使用 SharedFlow...无论是 EventBus 还是 LiveDataBus,它们本质上都是 “多对多的广播”,它们仅适合作为全局的事件通信,而页面内的事件通信应该继续采用 ViewModel + LiveData 等方案。
(this, observer) observe 方法中的 this 是实现了LifecycleOwner 接口的对象,比如 support 里的 AppCompatActivity 等 当我们对 simpleLiveData...() 创建观察者对象:new Observer() 绑定观察者对象:LiveData.observe 更新 LiveData 数据:LiveData.setValue 详细介绍 1、Api 介绍 LiveData...它新增了两个方法 addSource 、removeSource 用于添加和删除 LiveData 源 Observer: 观察者接口,通过该接口对 LiveData 数据进行观察 2、详细使用 MutableLiveData...变换操作 Transformations 上面介绍了 LiveData 的基础使用,我们还可以使用 Transformations 对 LiveData 进行变换操作,它提供了两个操作符 map 和 switchMap...在 onActive 里注册消息监听,onInactive 里移除监听,这样我们就可以使用 MessageLiveData 对最新消息进行观察。
View订阅LiveData中的变化,并对其做出反应。这对于在屏幕上连续显示并可能会修改的数据来说是非常有效的手段。...另外,从不同的线程设置值可能会导致竞赛条件,只产生一个对观察者的调用。 但前面这种解决方法的主要问题是,它很难理解,而且很难看,同时,我们如何确保在导航事件发生后值能被正确的重置?...OK: Use SingleLiveEvent SingleLiveEvent类是为一个样本创建的,作为对该特定场景有效的、推荐的解决方案。它是一个LiveData,但只发送一次更新。...LiveData对象与系统服务连接一次,然后任何需要该资源的观察者就可以观察LiveData对象。欲了解更多信息,请参见扩展LiveData。...Jose的解决方案缺乏对多个观察者的支持,而这正是LiveData以 "共享资源 "为名的承诺之一。 它不是线程安全的。 我还可以补充一个问题。
我们创建了一个Livedata,然后对这个Livedata Observe了10次,每次都是new出不同的Observer对象,看上去我们对一个数据源做了10个观察者的绑定。...这里一定要注意这个细节,否则在很多时候,会影响我们对问题的判断。再回到我们之前没有添加hashCode的代码,再仔细看看也就明白了:只是Log打印了两条而已,但是通知是收到了10次的,为啥打印两条?...{ liveData.observe(this, { t -> Log.v("ttt", "t:$t") }) } liveData.value...liveData.observe(this, { t -> Log.v("ttt", "t:$t $test") }) } liveData.value = 3...二、LiveData为何会收到Observe之前的消息 2.1 分析源码找原因 我们来看一个例子: fun test1() { val liveData = MutableLiveData
通过使用observe()方法,将上述的LiveData对象和Observer对象关联在一起。...三个步骤就定义了使用LiveData的方式,从步骤可以看出,使用了观察者模式,当LiveData对象持有数据发生变化,会通知对它订阅的所有处于活跃状态的订阅者。...nameTextView.text = newName } // Observe the LiveData, passing in this activity as the...model.currentName.observe(this, nameObserver) } } 在讲nameObserver对象传给observe()方法后,存储在LiveData最近的值以参数的形式立即传递到...光看文档,都可以感觉到Android 对设计模式,和MVP模式、MVVM模式设计理念使用得淋漓尽致。所以建议各位同学在代码方面的编写一定要有大局观念,代码规范的还是要有,方便别人就是方便自己。
View订阅LiveData中的变化,并对其做出反应。这对于在屏幕上连续显示并可能会修改的数据来说是非常有效的手段。...另外,从不同的线程设置值可能会导致竞赛条件,只产生一个对观察者的调用。 但前面这种解决方法的主要问题是,它很难理解,而且很难看,同时,我们如何确保在导航事件发生后值能被正确的重置?...✔️ OK: Use SingleLiveEvent SingleLiveEvent类是为一个样本创建的,作为对该特定场景有效的、推荐的解决方案。它是一个LiveData,但只发送一次更新。...Jose的解决方案缺乏对多个观察者的支持,而这正是LiveData以 "共享资源 "为名的承诺之一。 它不是线程安全的。 我还可以补充一个问题。...最后,我非常乐意看到你对它的反馈。
例如,我们可以在ViewModel中对加载的数据进行某些加工操作。...通过使用observe()方法将上述的LiveData对象和Observer对象关联在一起。...,会通知对它订阅的所有处于活跃状态的订阅者。...LiveData生命周期变化观察 前面介绍LiveData用法的时候提到,首先,我们创建 LiveData 实例,然后调用LiveData的observe方法来注册观察者,将ViewModel和LiveData...如果判断条件都满足就继续调用Observer的onChanged方法,这个方法正是使用LiveData的observe方法的回调。
LiveData 值的方法,重置之后,observer 中条件判断为 fasle,因此可以达到不更新 UI 的目的 示例代码 moneyReceivedViewModel.billLiveData.observe... = _billLiveData // 在 observe 之前和 show Toast 之后重置一下 LiveData fun reset() { _billLiveData.value...() 时机也不一样) 在 observe 之前发送的事件还是会被接收到,没有解决问题 姿势三:LiveData 包裹一个 Event open class Event(private val...但是笔者并不推荐使用这样的方式来绕过 LiveData 的限制,去打破 LiveData 原本的设计,这会让 LiveData 变得更让人难以理解 我们并不是非要用 LiveData 不可,LiveData...LiveData was designed to allow the View observe the ViewModel. Definitely use it for this!
目录介绍 01.LiveData是什么东西 02.使用LiveData的优势 03.使用LiveData的步骤 04.简单使用LiveData 05.observe()和observerForever(...通过 observe()方法连接观察者和LiveData。observe()方法需要携带一个LifecycleOwner类。这样就可以让观察者订阅LiveData中的数据,实现实时更新。...同样,通过这种方法修改LiveData中的值同样会触发所有对这个数据感兴趣的类。那么setValue()和postValue()有什么不同呢?...看了下面源代码可知,支持键值对存储,用链表实现,不是线程安全的。...LiveData 对同时多次修改数据做了处理,如果同时多次修改,只会修改为最新的数据。
同时提前看下我整理的 LiveData UML 图,对 LiveData 有个整体的了解,后续的涉及到的类都在这里了,有助于理解。 ?...2.1 LiveData.observe() LiveData 的使用流程从 observe() 开始,咱们尝试从 observe() 方法 开始分析: @MainThread public void...这里需要注意的是,当我们调用 observe() 注册后,由于绑定了 owner,所以在 active 的情况下,LiveData 如果有数据,则 Observer 会立马接受到该数据修改的通知。...注意:LiveData 对同时多次修改数据做了处理,如果同时多次修改,只会修改为最新的数据。 3. 图解 LiveData 3.1 LiveData 类图 再看一遍类图,回顾一下: ?...这时候需要使用 AlwaysActiveObserver ,改调用 observe 方法为调用 LiveData.observeForever(Observer) 方法即可。
不需要手动解除观察,开发者不需要在onPause或onDestroy方法中解除对LiveData的观察,因为LiveData能感知生命周期状态变化,所以会自动管理所有这些操作。...2.3 高级用法 如果希望在将 LiveData 对象分派给观察者之前对存储在其中的值进行更改,或者需要根据另一个实例的值返回不同的 LiveData 实例,可以使用LiveData中提供的Transformations....setValue(100); 使用很简单:原本的liveData1 没有添加观察者,而是使用Transformations.map()方法 对liveData1的数据进行的修改 生成了新的liveDataMap...3.1 添加观察者 LiveData原理是观察者模式,下面就先从LiveData.observe()方法看起: /** * 添加观察者. 事件在主线程分发....数据变化时及时回调到 传入的 } } } Source是MediatorLiveData的内部类,是对源LiveData的包装。
领取专属 10元无门槛券
手把手带您无忧上云