【机器学习】P21 正则化 Regularization(L1正则化 Lasso、L2正则化 Ridge、弹性网络正则化、Dropout正则化、早停法)

news2024/11/16 9:24:54

既然模型有概率发生过拟合现象,那么如何才能减少过拟合,或者防止过拟合的产生?方法之一就是正则化方法,Regularization;

我对正则化,有这样的理解:“我们既希望能够通过权重的调整从而建立更好的网络,但是又担心过拟合的发生,所以出现了正则化的方法。”

我对神经网络,暂时有这样的理解:“我们希望通过训练,能够获得更好的神经网络,什么是更好的神经网络?简单的说,就是损失值最低的神经网络,当然不仅在训练集上最低,在测试集上也要最低。但是只是简简单单的通过梯度下降更新参数从而降低损失值吗?其实我认为,万物在神经网络中都有固定的规律,人们只是尝试在寻找规律,这种规律的直观体现,就是诸多层和每层诸多神经元的这种多维度参数关系。”


正则化 Regularization

  • 什么是正则化,作用是什么
  • 常用正则化方法
    • L1 正则化(也称为Lasso正则化)
    • L2 正则化(也称为Ridge正则化)
    • 弹性网络正则化
    • Dropout正则化
    • 早停法


什么是正则化,作用是什么

正则化是一种常用的机器学习技术,用于减少模型的过拟合。在机器学习中,模型的目标是学习训练数据中的模式,并将这些模式应用于新的、未知的数据。然而,在模型过于复杂的情况下,模型可能会过拟合训练数据,这意味着模型过于依赖于训练数据中的噪声和不必要的特征,从而导致在新的、未知的数据上表现不佳。

怎样实现正则化?
正则化技术可以通过在模型的损失函数中添加一些额外的约束或惩罚项(具体如何添加惩罚项将在下一个部分伴随不同的正杂化方法具体阐述),来惩罚模型的复杂度,从而减少过拟合。


常用正则化方法

L1 正则化(也称为Lasso正则化)

在L1正则化中,我们向模型的损失函数中添加L1范数惩罚项。这个惩罚项是指模型参数的绝对值之和,例如在一个简单的线性回归模型中,目标函数可以写成:

  • 带有L1惩罚项的损失函数:

J ( w , b ) = 1 2 m ∑ i = 0 m − 1 ( f w , b ( x ( i ) ) − y ( i ) ) 2 + λ ∑ j = 0 n − 1 ∣ w j ∣ J(w,b) = \frac{1}{2m} \sum_{i=0}^{m-1} (f_{w,b}(x^{(i)})-y^{(i)})^2 + \lambda \sum_{j=0}^{n-1} |w_j| J(w,b)=2m1i=0m1(fw,b(x(i))y(i))2+λj=0n1wj

上述公式中, y ( i ) y^{(i)} y(i) 是第 i i i 个样本的实际值, f w , b ( x ( i ) ) f_{w,b}(x^{(i)}) fw,b(x(i)) 是模型对第 i i i 个样本的预测值, m m m 是样本数量, n n n 是模型参数的数量, w j w_j wj 是第 j j j 个参数的值, λ \lambda λ 是正则化系数,用来平衡损失函数和正则化项之间的权重。

  • L1 惩罚项:

λ ∑ j = 0 n − 1 ∣ w j ∣ \lambda \sum_{j=0}^{n-1} |w_j| λj=0n1wj

明显的,目标函数由两个部分组成,一个是之前为我们的损失函数,另一部分则是 L1惩罚项;L1惩罚项通过将模型参数的绝对值之和加到目标函数中,使得优化算法不仅要考虑如何拟合训练数据,还要考虑如何让模型参数的绝对值之和尽可能小。这就会导致一些参数的值变为零。

具体来说,当优化算法在迭代过程中对模型参数进行更新时,L1惩罚项会使得某些参数的值逐渐减小,直到最终变为零。这是因为,在更新模型参数时,优化算法会计算梯度,并按照梯度的方向进行调整。在加入L1惩罚项后,优化算法会在更新模型参数的同时,减去L1惩罚项对梯度的贡献,这会导致某些参数的梯度逐渐变小,直到最终变为零。

  • 带有 L1 惩罚项的梯度:

∂ J ( w , b ) ∂ w j = 1 m ∑ i = 0 m − 1 ( f w , b ( x ( i ) ) − y ( i ) ) x ( i ) + ∂ ( λ ∑ k = 0 n − 1 ∣ w k ∣ ) ∂ w j \frac {\partial J(w,b)} {\partial w_j} = \frac {1} {m} \sum _{i=0} ^{m-1} (f_{w,b}(x^{(i)})-y^{(i)})x^{(i)} + \frac {\partial (\lambda \sum_{k=0}^{n-1} |w_k|)} {\partial w_j} wjJ(w,b)=m1i=0m1(fw,b(x(i))y(i))x(i)+wj(λk=0n1wk)

  • 而 L1 惩罚项部分的梯度,因为:

∑ k = 0 n − 1 ∣ w k ∣ = w 0 + w 1 + . . . + w n − 1 \sum_{k=0}^{n-1} |w_k| = w_0 + w_1 + ... + w_{n-1} k=0n1wk=w0+w1+...+wn1

  • 可以化简为:

∂ ( λ ∑ k = 0 n − 1 ∣ w k ∣ ) ∂ w j = λ ∗ ∂ ( w 0 + w 1 + . . . + w j + . . . + w n − 1 ) ∂ w j = λ ∗ s i g n ( w j ) \frac {\partial (\lambda \sum_{k=0}^{n-1} |w_k|)} {\partial w_j} = \lambda * \frac {\partial (w_0 + w_1 + ... + w_j + ... + w_{n-1})} {\partial w_j} = \lambda * sign(w_j) wj(λk=0n1wk)=λwj(w0+w1+...+wj+...+wn1)=λsign(wj)

  • 而其中:

s i g n ( w j ) = { − 1 , x < 0 0 , x = 0 1 , x > 0 sign(w_j) = \begin{cases} -1 , x<0\\ 0, x=0\\ 1, x>0 \end{cases} sign(wj)= 1,x<00,x=01,x>0

  • 所以参数更新的公式为:

w j = w j − α ∂ L ( w ) ∂ w j − α λ s i g n ( w j ) w_j = w_j - \alpha \frac {\partial L(w)} {\partial w_j} - \alpha \lambda sign(w_j) wj=wjαwjL(w)αλsign(wj)

  • 即:

w j = w j − α 1 m ∑ i = 0 m − 1 ( f w , b ( x ( i ) ) − y ( i ) ) x ( i ) − α λ s i g n ( w j ) w_j = w_j - \alpha \frac {1} {m} \sum _{i=0} ^{m-1} (f_{w,b}(x^{(i)})-y^{(i)})x^{(i)} - \alpha \lambda sign(w_j) wj=wjαm1i=0m1(fw,b(x(i))y(i))x(i)αλsign(wj)

当某个参数的梯度变为零时,这个参数就不再被更新,其值也就保持为零,从而实现了将参数值设为零的效果。

例如,对于一个线性回归模型,L1正则化可能会将某些特征的系数设为零,这意味着这些特征对于模型的预测没有任何贡献。这样就可以使得模型更加简单,减少过拟合的风险,同时也提高了模型的可解释性。


L2 正则化(也称为Ridge正则化)

L2正则化方法通过对模型的权重参数进行L2范数惩罚,使得权重参数变得更加平滑,避免出现过于极端的权重值,从而实现对过拟合问题的缓解。

结合下述公式推导逐步理解:

  • 带有 L2惩罚项 的损失函数:

J ( w , b ) = 1 2 m ∑ i = 0 m − 1 ( f w , b ( x ( i ) ) − y ( i ) ) 2 + λ 2 ∑ j = 0 n − 1 w j 2 J(w,b) = \frac{1}{2m} \sum_{i=0}^{m-1} (f_{w,b}(x^{(i)})-y^{(i)})^2 + \frac {\lambda} {2} \sum_{j=0}^{n-1} w_j^2 J(w,b)=2m1i=0m1(fw,b(x(i))y(i))2+2λj=0n1wj2

  • 带有 L2 惩罚项 的梯度:

∂ J ( w , b ) ∂ w j = 1 m ∑ i = 0 m − 1 ( f w , b ( x ( i ) ) − y ( i ) ) x ( i ) + ∂ ( λ ∑ k = 0 n − 1 w k 2 ) ∂ w j \frac {\partial J(w,b)} {\partial w_j} = \frac {1} {m} \sum _{i=0} ^{m-1} (f_{w,b}(x^{(i)})-y^{(i)})x^{(i)} + \frac {\partial (\lambda \sum_{k=0}^{n-1} w_k^2)} {\partial w_j} wjJ(w,b)=m1i=0m1(fw,b(x(i))y(i))x(i)+wj(λk=0n1wk2)

  • 而 L2 惩罚项部分的梯度,因为:

∑ k = 0 n − 1 w k 2 = w 0 2 + w 1 2 + . . . + w k 2 + w n − 1 2 \sum_{k=0}^{n-1} w_k^2 = w_0^2 + w_1^2 + ... + w_k^2 + w_{n-1}^2 k=0n1wk2=w02+w12+...+wk2+wn12

  • 可以化简为:

∂ ( λ ∑ k = 0 n − 1 w k 2 ) ∂ w j = λ 2 ∗ ∂ ( w 0 2 + w 1 2 + . . . + w j 2 + . . . + w n − 1 2 ) ∂ w j = λ ∗ w j \frac {\partial (\lambda \sum_{k=0}^{n-1} w_k^2)} {\partial w_j} = \frac {\lambda} 2 * \frac {\partial (w_0^2 + w_1^2 + ... + w_j^2 + ... + w_{n-1}^2)} {\partial w_j} = \lambda * w_j wj(λk=0n1wk2)=2λwj(w02+w12+...+wj2+...+wn12)=λwj

  • 所以参数更新的公式为:

w j = w j − α ∂ L ( w ) ∂ w j − α λ w j w_j = w_j - \alpha \frac {\partial L(w)} {\partial w_j} - \alpha \lambda w_j wj=wjαwjL(w)αλwj


所以,为什么L2惩罚会使得权重参数更加平滑?

  • 首先,L2惩罚使得训练过程中的梯度对于较大的权重值变得更加敏感,从而更容易使得这些权重值减小(平方);
  • 相比之下,如果没有正则化项,那么模型可能会倾向于选择某些特定的参数值非常大,而这些参数值在训练集上能够取得非常好的拟合效果,但是在测试集上却无法很好地泛化,从而出现过拟合的情况。
  • 通过对模型参数的平方进行惩罚,L2正则化的效果就相当于对模型的所有参数进行了平滑化处理,从而防止模型出现过于复杂的情况,提高模型的泛化能力。因此,L2正则化能够在一定程度上保证模型参数的平滑性,使得模型更加稳定,更具有泛化能力。

弹性网络正则化

弹性网络正则化(Elastic Net Regularization)结合了 L1 和 L2 正则化的线性回归算法,旨在克服L1和L2正则化的缺点,同时具备两种正则化方法的优点。

  • 弹性网络正则化的目标函数由两部分组成:L1正则化和L2正则化:

J ( w , b ) = 1 2 m ∑ i = 0 m − 1 ( f w , b ( x ( i ) ) − y ( i ) ) 2 + λ ρ ∑ j = 0 n − 1 ∣ w j ∣ + λ ( 1 − ρ ) 2 ∑ j = 0 n − 1 w j 2 J(w,b) = \frac{1}{2m} \sum_{i=0}^{m-1} (f_{w,b}(x^{(i)})-y^{(i)})^2 + \lambda \rho \sum_{j=0}^{n-1} |w_j| + \frac {\lambda (1 - \rho )} {2} \sum_{j=0}^{n-1} w_j^2 J(w,b)=2m1i=0m1(fw,b(x(i))y(i))2+λρj=0n1wj+2λ(1ρ)j=0n1wj2

其中, m m m 表示样本数量, n n n 表示特征数量, f w , b ( x ( i ) ) f_{w,b}(x^{(i)}) fw,b(x(i)) 表示模型的预测值, y ( i ) y^{(i)} y(i) 表示真实值, w , b w, b w,b 是模型参数, λ \lambda λ 表示正则化强度, ρ \rho ρ 是 L1 和 L2 正则化的混合比例,通常取值为 0.5

  • 而结合上述的 L1 与 L2 正则化部分,可以得到参数更新的公式为:

w j = w j − α ∂ L ( w ) ∂ w j − α ρ λ w j − α λ ( 1 − ρ ) w j w_j = w_j - \alpha \frac {\partial L(w)} {\partial w_j} - \alpha \rho \lambda w_j - \alpha \lambda (1-\rho) w_j wj=wjαwjL(w)αρλwjαλ(1ρ)wj

目标函数的第一项是均方误差(MSE),表示模型的预测值和真实值之间的差异;第二项是L1正则化,惩罚模型参数的绝对值,产生稀疏的权重矩阵;第三项是L2正则化,惩罚模型参数的平方和,使得模型的权重更加平滑。

相比于L1正则化和L2正则化,弹性网络正则化可以有效地避免L1正则化的过度稀疏和L2正则化的过度平滑。在具有大量特征的高维数据集上,弹性网络正则化可以更好地选择具有相关性的特征,同时减少非相关特征的影响,从而提高模型的泛化能力。


Dropout正则化

Dropout是一种广泛使用的正则化技术,用于防止神经网络过拟合。在 Dropout 正则化中,随机选择一些神经元并在训练过程中将其丢弃,即将它们的输出置为 0。

Dropout的工作原理是,在每次训练迭代中,每个神经元都有一定的概率被丢弃,这个概率通常在 0.2 到 0.5 之间。通过随机地丢弃神经元,使得神经网络不依赖于任何单个神经元。这有助于防止过拟合,因为如果神经网络过度依赖于某些神经元,则该网络在处理新数据时可能无法进行准确的预测。

步骤流程为:

  1. 随机失活: 对于每次训练迭代,随机选择一部分神经元进行失活(即将神经元输出值设为0),以概率 p p p 失活, p p p 的值介于 0.2~0.5

  2. 前向传播: 将失活后的神经元的输出结果 0 通过前向传播送入下一层神经元进行计算,最终得到预测值,通过预测值与实际值的差,得到损失值。

  3. 反向传播: 通过反向传播计算神经元的误差,并更新参数。在反向传播的过程中,失活的神经元的权重不参与计算,因此参数更新的过程只会影响保留的神经元,从而避免过拟合。

  4. 恢复神经元: 恢复刚刚失活的神经元,通过随机给其参数赋值,然后参与到后续的循环迭代中。

  5. 重复执行: 重复执行以上步骤多次,直到模型收敛。

  • 丢弃的神经元如何恢复?

在使用Dropout正则化时,训练过程中被丢弃的神经元的激活值会被设为0。这意味着在前向传播和反向传播过程中,这些神经元不会对其他神经元产生影响。

举个例子,假设某个神经元的权重值为0.1。在训练过程中,如果这个神经元被随机丢弃,那么它的激活值会被设为0,但其权重值仍然保持为0.1。在前向传播和反向传播过程中,这个神经元对其他神经元的影响会被忽略。当完成这次迭代后,这个神经元的权重值仍然保持为0.1。

在下一次迭代过程中,这个神经元可能会被保留(即不再被丢弃)。在这种情况下,它将恢复其原有的权重值(在这个例子中是0.1),并重新参与前向传播和反向传播过程。通过这种方式,Dropout正则化有助于防止神经网络过度依赖单个神经元,从而提高网络的泛化能力。

所以,当神经元被丢弃时,其权重值保持不变。在下一个迭代过程中,如果神经元未被丢弃,它将恢复其原有的权重值,而不是被赋予一个随机值。

  • 为什么神经网络会过于依赖某个神经元

神经网络在训练过程中可能会过于依赖某个神经元的原因有以下几点:

  1. 高权重: 神经元的权重决定了其在神经网络中的重要性。当某个神经元的权重较大时,该神经元对网络输出的贡献也相对较大。这可能导致网络在训练过程中过分依赖这个神经元。然而,这种依赖可能会导致过拟合,因为网络过度拟合训练数据中的特定模式,降低了泛化能力。

  2. 网络结构不合理: 如果神经网络结构不合理,可能导致某些神经元在训练过程中变得过于重要。例如,在一个过于复杂的网络中,网络可能会学习到训练数据中的噪声,从而导致过拟合。在这种情况下,网络可能会过度依赖某些神经元,以捕捉数据中的这些噪声模式。

  3. 训练数据不均衡: 如果训练数据存在类别不平衡或某些特征过于显著,神经网络可能会过度依赖某些神经元来拟合这些特征。这可能导致网络在面对新数据时泛化能力下降。

  • 使用 Dropout 正则化方法的神经网络训练案例 MINST
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout, Flatten
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.datasets import mnist

# 加载MNIST数据集
(x_train, y_train), (x_test, y_test) = mnist.load_data()

# 定义模型
model = Sequential([
    Flatten(input_shape=(28, 28, 1)),
    Dense(256, activation='relu'),
    Dropout(0.5),
    Dense(128, activation='relu'),
    Dropout(0.5),
    Dense(10, activation='softmax')
])

# 编译模型
model.compile(optimizer=Adam(),
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

# 训练模型
model.fit(x_train, y_train, epochs=40, batch_size=128, validation_data=(x_test, y_test))

from sklearn.metrics import accuracy_score
import numpy as np

# 测试集数据
pred_y = model.predict(x_test)
pred_labels = np.argmax(pred_y, axis=1)
acc = accuracy_score(y_test, pred_labels)
print('Test accuracy:', acc)

在这里插入图片描述


早停法

早停法同样是一种基于验证误差的正则化方法。其基本思想是,在模型训练过程中,我们通常会将训练集分为训练集和验证集,其中训练集用于训练模型,验证集用于监控模型的泛化能力。每次训练一个epoch之后,我们计算模型在验证集上的误差(如分类任务中的交叉熵损失),如果验证误差开始增加,则停止训练,否则继续训练。

但是需要注意的是,一般来说,并不是验证误差开始上升,就立即停止训练。反而,如果验证误差的上升非常缓慢,并且当前的验证误差仍然比之前的最小值小很多,那么我们通常会允许模型继续训练一段时间,以便模型进一步优化,而不是立即停止训练。

因此,早停法并不是一旦验证误差开始增加就立即停止训练,而是要结合当前的验证误差和之前的最小值来决定是否停止训练。一般来说,我们会设置一个阈值来控制停止训练的条件,例如当验证误差连续几个epoch没有下降,或者增加的幅度超过一定阈值时,就可以停止训练。

  • 一个应用早停法的MINST手写识别Tensorflow案例
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras.datasets import mnist

# 加载数据集并进行预处理
(x_train, y_train), (x_test, y_test) = mnist.load_data()

# 定义模型
model = keras.Sequential([
    keras.layers.Flatten(input_shape=(28, 28)),
    keras.layers.Dense(128, activation='relu'),
    keras.layers.Dense(10, activation='softmax')
])

# 定义损失函数和优化器
loss_fn = keras.losses.SparseCategoricalCrossentropy()
optimizer = keras.optimizers.Adam()

# 定义早停法
early_stop = keras.callbacks.EarlyStopping(monitor='val_loss', patience=5)

# 训练模型
model.compile(optimizer=optimizer, loss=loss_fn, metrics=['accuracy'])
history = model.fit(x_train, y_train, epochs=50, validation_data=(x_test, y_test), callbacks=[early_stop])

from sklearn.metrics import accuracy_score
import numpy as np

# 测试集数据
pred_y = model.predict(x_test)
pred_labels = np.argmax(pred_y, axis=1)
acc = accuracy_score(y_test, pred_labels)
print('Test accuracy:', acc)

上述简单代码中,我们使用早停法为了防止过拟合:

early_stop = keras.callbacks.EarlyStopping(monitor='val_loss', patience=5)

其中 patience=5 的含义是如果验证集的损失连续5个epoch没有下降,就停止训练。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/439189.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构考研版——括号的匹配问题栈的计算问题

一、括号的匹配问题 这玩意太简单了没什么讲头&#xff0c;就是括号一个一个进栈&#xff0c;匹配就出&#xff0c;以此类推 二、括号匹配问题代码 int isMatched(char left, char right) {if (left (&& right ))return 1;else if (left [ && right ])ret…

还在发愁项目去哪找?软件测试企业级Web自动化测试实战项目

今天给大家分享一个简单易操作的实战项目&#xff08;已开源&#xff09; 项目名称 ET开源商场系统 项目描述 ETshop是一个电子商务B2C电商平台系统&#xff0c;功能强大&#xff0c;安全便捷。适合企业及个人快速构建个性化网上商城。 包含PCIOS客户端Adroid客户端微商城…

Java语法理论和面经杂疑篇《十. 反射机制》

目录 1. 反射(Reflection)的概念 1.1 反射的出现背景 1.2 反射概述 1.3 Java反射机制研究及应用 1.4 反射相关的主要API 1.5 反射的优缺点 2. 理解Class类并获取Class实例 2.1 理解Class 2.1.1 理论上 2.1.2 内存结构上 2.2 获取Class类的实例(四种方法) 2.3 哪些类…

设计模式:创建者模式 - 原型模式

文章目录 1.概述2.结构3.实现4.案例5.使用场景6.扩展&#xff08;深克隆&#xff09; 1.概述 用一个已经创建的实例作为原型&#xff0c;通过复制该原型对象来创建一个和原型对象相同的新对象。 2.结构 原型模式包含如下角色&#xff1a; 抽象原型类&#xff1a;规定了具体…

nodejs+vue宠物商城健康医院挂号服务管理系统python+java+php

在前台&#xff0c;首先提供一个界面清晰、导航明确的首页&#xff0c;无论是会员还是游客都可以访问。游客通过首页查看该网站所要具备的功能&#xff0c;以及对应的周边商城信息&#xff0c;特别在周边商城模块&#xff0c;需要明确的进行介绍&#xff0c;突出周边商城特色和…

如何主动增加自己的开源项目star数的方法汇总

本篇文章主要讲解&#xff0c;通过自媒体、短视频、网络平台等渠道形式增加自己的开源项目的曝光度以增加star数的方法。 作者&#xff1a;任聪聪 日期&#xff1a;2023年4月20日 开源项目的star数在某些找工作的情况下是有一定的加分的&#xff0c;故此价值是一定的。但是自己…

arm64异常向量表

arm64异常向量表 1 arm64异常向量表2 linux arm64异常向量表3 kernel_ventry宏4 异常向量表的保存4. VBAR_ELx寄存器4.2 __primary_switched4.3 __primary_switched 1 arm64异常向量表 When an exception occurs, the processor must execute handler code which corresponds t…

电力系统谐波影响及治理

1.谐波 众所周知&#xff0c;理想的电力系统向用户提供的是一个恒定工频的正弦波形电压&#xff0c;但是由于各种原因&#xff0c;使这种理想状态在实际中无法存在。当正弦波电压施加在非线性电路上时&#xff0c;电流就变成非正弦波&#xff0c;非正弦电流在电网阻抗上产生压…

机器学习:基于逻辑回归和高斯贝叶斯对人口普查数据集的分类与预测

机器学习:基于逻辑回归和高斯贝叶斯对人口普查数据集的分类与预测作者:i阿极 作者简介:Python领域新星作者、多项比赛获奖者:博主个人首页 😊😊😊如果觉得文章不错或能帮助到你学习,可以点赞👍收藏📁评论📒+关注哦!👍👍👍 📜📜📜如果有小伙伴需要…

【python】采集每日必看黄色软件数据~

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 环境使用: Python 3.8 Pycharm 模块使用: requests >>> pip install requests re csv 安装模块&#xff1a;win R 输入cmd 输入安装命令 pip install 模块名 如果出现爆红 可能是因为 网络连接超时 切换国内…

【云原生】Dockerfile制作WordPress镜像,实现compose编排部署

文章目录 &#x1f479; 关于作者前言环境准备目录结构 dockerfile制作镜像yum 脚本Dockerfile-mariadb 镜像Dockerfile-service 镜像docker compose 编排 提升✊ 最后 &#x1f479; 关于作者 大家好&#xff0c;我是秋意临。 &#x1f608; CSDN作者主页 &#x1f60e; 博客…

谷歌Colab云端部署Stable Diffusion 进行绘图

系列文章目录 本地部署Stable Diffusion教程&#xff0c;亲测可以安装成功 Stable Diffusion界面参数及模型使用 文章目录 系列文章目录前言一、Colab是什么&#xff1f;二、操作步骤1.找到对应的脚本2.在谷歌Colab里执行脚本3.装载想要的模型4.开始绘图 前言 在之前的博客里…

设计模式:创建者模式 - 工厂模式

文章目录 1.概述2.简单工厂模式&#xff08;非23种&#xff09;2.1 结构2.2 实现2.3 优缺点2.4 扩展 3.工厂方法模式3.1 概念3.2 结构3.3 实现3.4 优缺点 4.抽象工厂模式4.1 概念4.2 结构4.3 实现4.4 优缺点4.5 使用场景 5.模式扩展6.JDK源码解析-Collection.iterator方法 1.概…

【Linux】线程安全——补充|互斥、锁|同步、条件变量

文章目录 一、知识补充线程的ID局部存储验证Thread.hpp——线程的封装 二、线程安全问题三、Linux线程互斥互斥相关概念互斥量mutexmutex的使用全局锁的使用局部锁的使用 mutex的理解Mutex.hpp——mutex的封装可重入VS线程安全死锁 四、Linux线程同步条件变量条件变量接口理解条…

工序流转二维码的应用和制作方法

很多中小型生产企业还在使用纸制的“工序流转卡”&#xff0c;每天交给专员人工录入到电脑上&#xff0c;不仅费时费力&#xff0c;还容易出错&#xff0c;更重要的是管理员不能实时掌握各个订单的进展情况&#xff0c;因此经常会发生订单延期交付的情况&#xff0c;给企业带来…

centos7.9系统部署NFS详细流程—2023.04

文章目录 NFS与RPC关系前提关闭防火墙和selinux安装 NFS 和 RPC测试取消挂载 NFS与RPC关系 简单点可以这么理解&#xff0c;RPC和NFS的关系&#xff1a;NFS是一个文件系统&#xff0c;而RPC是负责负责信息的传输。 NFS&#xff08;Network File System&#xff09;即网络文件…

Python数据分析项目实战

现成案例分享 Python数据分析&#xff1a;股票数据分析案例 步骤&#xff1a; 准备数据可视化数据、审查数据处理数据根据ACF、PACF定阶拟合ARIMA模型预测 作者&#xff1a;python分享站 链接&#xff1a;https://www.zhihu.com/question/280744341/answer/1651341817 来源&…

Windows下载redis

下载微软的 Redis和配置 Windows下载redis1&#xff0c;下载redis2&#xff0c;解压压缩包3&#xff0c;启动Redis临时服务4&#xff0c;启动Redis客户端测试连接5, Redis配置 &#xff08;可选&#xff09;1&#xff0c; 配置系统环境变量2&#xff0c;添加Redis服务3&#xf…

数据结构——排序(5)

作者&#xff1a;几冬雪来 时间&#xff1a;2023年4月14日 内容&#xff1a;数据结构排序内容讲解 目录 前言&#xff1a; 1.非递归归并排序&#xff1a; 2.越界情况&#xff1a; 3.计数排序&#xff1a; 结尾&#xff1a; 前言&#xff1a; 在上一篇博客中我们对归…

硬件语言Verilog HDL牛客刷题day10 华W部分 和 DJ部分

1. VL63 并串转换 1.题目&#xff1a; 设计一个模块进行并串转换&#xff0c;要求每四位d输为转到一位dout输出&#xff0c;输出valid_in表示此时的输入有效。 2.解题思路 2.1 计数记录输出的位数。 2.2 数据 有一个延时。 2.3 思路就是 搞一个寄存器存储数据&#xff0c;然后…