42、基于神经网络的训练堆叠自编码器进行图像分类(matlab)

1、训练堆叠自编码器进行图像分类的原理及流程

基于神经网络的训练堆叠自编码器进行图像分类的原理和流程如下:

  1. 堆叠自编码器(Stacked Autoencoder)是一种无监督学习算法,由多个自编码器(Autoencoder)堆叠在一起构成。每个自编码器由一个编码器和一个解码器组成,用于学习数据的有效表示。

  2. 在图像分类任务中,首先将输入图像通过编码器部分提取特征,然后通过解码器将提取的特征重构为原始图像。通过重复此过程多次,可以逐渐提高模型对数据的表示能力。

  3. 堆叠自编码器的训练过程包括以下步骤:

    • 输入图像经过第一个编码器得到第一层的特征表示;
    • 将第一层的特征表示输入到第二个编码器中,再经过解码器重构为原始图像,得到第二层的特征表示;
    • 重复上述步骤直到所有的编码器和解码器都被训练完成。
  4. 训练堆叠自编码器的目标是最小化重构误差,即原始图像与重构图像之间的差异。通过反向传播算法来更新网络参数,使得重构误差最小化。

  5. 训练完成后,可以将堆叠自编码器的编码器部分作为特征提取器,将提取的特征输入到分类器中进行图像分类任务。

总的来说,基于神经网络的训练堆叠自编码器进行图像分类的流程是通过无监督学习训练多个自编码器,逐步从原始输入中提取特征,最终将提取的特征输入到分类器中进行图像分类任务。

2、 训练堆叠自编码器进行图像分类说明

说明1

具有多个隐含层的神经网络可用于处理复杂数据(例如图像)的分类问题。

每个层都可以学习不同抽象级别的特征。一种有效训练具有多个层的神经网络的方法是一次训练一个层。可以为每个所需的隐含层训练一种称为自编码器的特殊类型的网络。


说明2

训练具有两个隐含层的神经网络以对图像中的数字进行分类。首先,使用自编码器以无监督方式单独训练各隐含层。然后训练最终 softmax 层,并将这些层连接在一起形成堆叠网络,该网络最后以有监督方式进行训练。

3、数据集

说明

使用合成数据进行训练和测试。通过对使用不同字体创建的数字图像应用随机仿射变换来生成合成图像。
每个数字图像为 28×28 像素,共有 5000 个训练样本。可以加载训练数据,并查看其中一些图像。
图像的标签存储在一个 10×5000 矩阵中,其中每列都有一个元素为 1,指示该数字所属的类,该列中的所有其他元素为 0。请注意,如果第十个元素是 1,则数字图像是零。


1)加载训练数据到内存

代码

[xTrainImages,tTrain] = digitTrainCellArrayData;

2)展示训练图片

代码

clf
figure(1)
for i = 1:25subplot(5,5,i);imshow(xTrainImages{i});
end

试图效果

 4、训练第一个自编码器

说明

在不使用标签的情况下基于训练数据训练稀疏自编码器

自编码器是一种神经网络,该网络会尝试在其输出端复制其输入。因此,其输入的大小将与其输出的大小相同。当隐藏层中的神经元数量小于输入的大小时,自编码器将学习输入的压缩表示。神经网络在训练前具有随机初始化的权重。因此,每次训练的结果都不同。

1)显式设置随机数生成器种子

代码

rng('default')

2)设置自编码器的隐含层的大小。

说明:对于要训练的自编码器,最好使隐含层的大小小于输入大小。

代码

hiddenSize1 = 100;

 3)训练的自编码器的类型是稀疏自编码器

说明:该自编码器使用正则项来学习第一层中的稀疏表示。可以设置各种参数来控制这些正则项的影响:

L2WeightRegularization 控制 L2 正则项对网络权重(而不是偏置)的影响。这通常应该非常小。
SparsityRegularization 控制稀疏正则项的影响,该正则项会尝试对隐含层的输出的稀疏性施加约束。请注意,这与将稀疏正则项应用于权重不同。
SparsityProportion 是稀疏正则项的参数。它控制隐含层的输出的稀疏性。较SparsityProportion 值通常导致只为少数训练样本提供高输出,从而使隐藏层中的每个神经元“专门化”。例如,如果 SparsityProportion 设置为 0.1,这相当于说隐藏层中的每个神经元针对训练样本的平均输出值应该为 0.1。此值必须介于 0 和 1 之间。理想值因问题的性质而异。


现在训练自编码器,指定上述正则项的值代码

autoenc1 = trainAutoencoder(xTrainImages,hiddenSize1, ...'MaxEpochs',400, ...'L2WeightRegularization',0.004, ...'SparsityRegularization',4, ...'SparsityProportion',0.15, ...'ScaleData', false);
view(autoenc1)

 视图效果

说明:自编码器由一个编码器和一个解码器组成。编码器将输入映射为隐含表示,解码器则尝试进行逆映射以重新构造原始输入。


 

 5、可视化第一个自编码器的权重

说明

自编码器的编码器部分所学习的映射可用于从数据中提取特征。编码器中的每个神经元都具有一个与之相关联的权重向量,该向量将进行相应调整以响应特定可视化特征。您可以查看这些特征的表示。
自编码器学习的特征代表了数字图像中的弯曲和笔划图案。
自编码器的隐含层的 100 维输出是输入的压缩版本,它汇总了对上面可视化的特征的响应。基于从训练数据中提取的一组向量训练下一个自编码器。首先,必须使用经过训练的自编码器中的编码器生成特征。


代码

figure(2)
plotWeights(autoenc1);
feat1 = encode(autoenc1,xTrainImages);

视图效果

 6、训练第二个自编码器

说明

以相似的方式训练第二个自编码器。主要区别在于使用从第一个自编码器生成的特征作为第二个自编码器中的训练数据。此外,您还需要将隐含表示的大小减小到 50,以便第二个自编码器中的编码器学习输入数据的更小表示。


代码

hiddenSize2 = 50;
autoenc2 = trainAutoencoder(feat1,hiddenSize2, ...'MaxEpochs',100, ...'L2WeightRegularization',0.002, ...'SparsityRegularization',4, ...'SparsityProportion',0.1, ...'ScaleData', false);
%使用 view 函数查看自编码器的图。
view(autoenc2)

视图效果

 将前一组特征传递给第二个自编码器中的编码器,以此提取第二组特征

说明:训练数据中的原始向量具有 784 个维度。原始数据通过第一个编码器后,维度减小到 100 维。应用第二个编码器后,维度进一步减小到 50 维。您现在可以训练最终层,以将这些 50 维向量分类为不同的数字类。

代码

feat2 = encode(autoenc2,feat1);

7、 训练最终 softmax 层

说明

训练 softmax 层以对 50 维特征向量进行分类。与自编码器不同,您将使用训练数据的标签以有监督方式训练 softmax 层。

代码

%说明:训练 softmax 层以对 50 维特征向量进行分类。与自编码器不同,您将使用训练数据的标签以有监督方式训练 softmax 层。
softnet = trainSoftmaxLayer(feat2,tTrain,'MaxEpochs',400);
%view 函数查看 softmax 层的图。
view(softnet)

视图效果


 

8、 形成堆叠神经网络

说明

已单独训练了组成堆叠神经网络的三个网络。可以查看已经过训练的三个神经网络 autoenc1、autoenc2 和 softnet。

1)形成用于分类的堆叠网络

代码

自编码器中的编码器已用于提取特征。可以将自编码器中的编码器与 softmax 层堆叠在一起,以形成用于分类的堆叠网络。
stackednet = stack(autoenc1,autoenc2,softnet);
% view 函数查看堆叠网络的图。该网络由自编码器中的编码器和 softmax 层构成。
view(stackednet)

视图效果

 2)基于测试集计算结果

说明:基于测试集计算结果。要将图像用于堆叠网络,必须将测试图像重构为矩阵。这可以通过先堆叠图像的各列以形成向量,然后根据这些向量形成矩阵来完成。


代码

% 获取图片像素
imageWidth = 28;
imageHeight = 28;
inputSize = imageWidth*imageHeight;
% 加载测试图片
[xTestImages,tTest] = digitTestCellArrayData;% 堆叠图像的各列以形成向量,然后根据这些向量形成矩阵
xTest = zeros(inputSize,numel(xTestImages));
for i = 1:numel(xTestImages)xTest(:,i) = xTestImages{i}(:);
end
%使用混淆矩阵来可视化结果。矩阵右下角方块中的数字表示整体准确度。
y = stackednet(xTest);
plotconfusion(tTest,y);

视图效果

9、  微调堆叠神经网络

说明

通过对整个多层网络执行反向传播,可以改进堆叠神经网络的结果。此过程通常称为微调。通过以有监督方式基于训练数据重新训练网络来微调网络。将训练图像重构为矩阵,就像对测试图像所做的那样。


1)堆叠图像的各列以形成向量,然后根据这些向量形成矩阵

代码

xTrain = zeros(inputSize,numel(xTrainImages));
for i = 1:numel(xTrainImages)xTrain(:,i) = xTrainImages{i}(:);
end

2)微调执行

代码

stackednet = train(stackednet,xTrain,tTrain);

3) 使用混淆矩阵再次查看结果

代码

y = stackednet(xTest);
plotconfusion(tTest,y);

视图效果 

10、总结 

在Matlab中基于神经网络的训练堆叠自编码器进行图像分类可以按照以下步骤进行:

  1. 数据准备:准备图像数据集,并对图像进行预处理,如缩放、归一化等操作。

  2. 构建自编码器模型:使用Matlab的深度学习工具箱(Deep Learning Toolbox)构建堆叠自编码器模型。根据需要的深度,堆叠多个自编码器,每个自编码器包括编码器和解码器部分。

  3. 定义训练参数:设置训练参数,包括学习率、迭代次数、优化器等。

  4. 训练模型:使用训练数据集对堆叠自编码器模型进行训练,通过计算重构误差来更新模型参数。

  5. 特征提取:训练完成后,提取编码器部分作为特征提取器,对数据进行特征提取。

  6. 构建分类器:使用Matlab内置的分类器算法(如支持向量机、K近邻等)或者构建深度学习的分类器模型,将提取的特征输入到分类器中进行图像分类。

  7. 模型评估:使用测试数据集对训练好的模型进行评估和性能测试,评估模型的准确率、召回率等指标。

总的来说,在Matlab中进行基于神经网络的训练堆叠自编码器进行图像分类的流程包括数据准备、模型构建、训练、特征提取、分类器构建和模型评估等步骤。通过这个过程,可以实现图像分类任务并得到准确的分类结果。

11、源代码

代码

%% 训练堆叠自编码器进行图像分类
%说明:具有多个隐含层的神经网络可用于处理复杂数据(例如图像)的分类问题。每个层都可以学习不同抽象级别的特征。
%一种有效训练具有多个层的神经网络的方法是一次训练一个层。可以为每个所需的隐含层训练一种称为自编码器的特殊类型的网络。
%说明:训练具有两个隐含层的神经网络以对图像中的数字进行分类。首先,使用自编码器以无监督方式单独训练各隐含层。然后训练最终 softmax 层,
%并将这些层连接在一起形成堆叠网络,该网络最后以有监督方式进行训练。
%% 数据集
%说明:使用合成数据进行训练和测试。通过对使用不同字体创建的数字图像应用随机仿射变换来生成合成图像。
%每个数字图像为 28×28 像素,共有 5000 个训练样本。可以加载训练数据,并查看其中一些图像。
%图像的标签存储在一个 10×5000 矩阵中,其中每列都有一个元素为 1,指示该数字所属的类,该列中的所有其他元素为 0。请注意,如果第十个元素是 1,则数字图像是零。
% 加载训练数据到内存
[xTrainImages,tTrain] = digitTrainCellArrayData;
% 展示训练图片
clf
figure(1)
for i = 1:25subplot(5,5,i);imshow(xTrainImages{i});
end
%% 训练第一个自编码器
%说明:在不使用标签的情况下基于训练数据训练稀疏自编码器
%自编码器是一种神经网络,该网络会尝试在其输出端复制其输入。因此,其输入的大小将与其输出的大小相同。当隐藏层中的神经元数量小于输入的大小时,自编码器将学习输入的压缩表示。
%神经网络在训练前具有随机初始化的权重。因此,每次训练的结果都不同。
%显式设置随机数生成器种子。
rng('default')
%设置自编码器的隐含层的大小。对于要训练的自编码器,最好使隐含层的大小小于输入大小。
hiddenSize1 = 100;
%训练的自编码器的类型是稀疏自编码器。该自编码器使用正则项来学习第一层中的稀疏表示。可以设置各种参数来控制这些正则项的影响:
%L2WeightRegularization 控制 L2 正则项对网络权重(而不是偏置)的影响。这通常应该非常小。
%SparsityRegularization 控制稀疏正则项的影响,该正则项会尝试对隐含层的输出的稀疏性施加约束。请注意,这与将稀疏正则项应用于权重不同。
%SparsityProportion 是稀疏正则项的参数。它控制隐含层的输出的稀疏性。较低的 SparsityProportion 值通常导致只为少数训练样本提供高输出,从而使隐藏层中的每个神经元“专门化”。例如,如果 SparsityProportion 设置为 0.1,这相当于说隐藏层中的每个神经元针对训练样本的平均输出值应该为 0.1。此值必须介于 0 和 1 之间。理想值因问题的性质而异。
%现在训练自编码器,指定上述正则项的值。
autoenc1 = trainAutoencoder(xTrainImages,hiddenSize1, ...'MaxEpochs',400, ...'L2WeightRegularization',0.004, ...'SparsityRegularization',4, ...'SparsityProportion',0.15, ...'ScaleData', false);
%自编码器由一个编码器和一个解码器组成。编码器将输入映射为隐含表示,解码器则尝试进行逆映射以重新构造原始输入。
view(autoenc1)
%% 可视化第一个自编码器的权重
%自编码器的编码器部分所学习的映射可用于从数据中提取特征。编码器中的每个神经元都具有一个与之相关联的权重向量,该向量将进行相应调整以响应特定可视化特征。您可以查看这些特征的表示。
%自编码器学习的特征代表了数字图像中的弯曲和笔划图案。
%自编码器的隐含层的 100 维输出是输入的压缩版本,它汇总了对上面可视化的特征的响应。基于从训练数据中提取的一组向量训练下一个自编码器。首先,必须使用经过训练的自编码器中的编码器生成特征。
figure(2)
plotWeights(autoenc1);
feat1 = encode(autoenc1,xTrainImages);
%% 训练第二个自编码器
%说明:以相似的方式训练第二个自编码器。主要区别在于使用从第一个自编码器生成的特征作为第二个自编码器中的训练数据。此外,您还需要将隐含表示的大小减小到 50,以便第二个自编码器中的编码器学习输入数据的更小表示。
hiddenSize2 = 50;
autoenc2 = trainAutoencoder(feat1,hiddenSize2, ...'MaxEpochs',100, ...'L2WeightRegularization',0.002, ...'SparsityRegularization',4, ...'SparsityProportion',0.1, ...'ScaleData', false);
%使用 view 函数查看自编码器的图。
view(autoenc2)
%将前一组特征传递给第二个自编码器中的编码器,以此提取第二组特征。
feat2 = encode(autoenc2,feat1);
%训练数据中的原始向量具有 784 个维度。原始数据通过第一个编码器后,维度减小到 100 维。应用第二个编码器后,维度进一步减小到 50 维。您现在可以训练最终层,以将这些 50 维向量分类为不同的数字类。
%% 训练最终 softmax 层
%说明:训练 softmax 层以对 50 维特征向量进行分类。与自编码器不同,您将使用训练数据的标签以有监督方式训练 softmax 层。
softnet = trainSoftmaxLayer(feat2,tTrain,'MaxEpochs',400);
%view 函数查看 softmax 层的图。
view(softnet)
%% 形成堆叠神经网络
%已单独训练了组成堆叠神经网络的三个网络。可以查看已经过训练的三个神经网络 autoenc1、autoenc2 和 softnet。
view(autoenc1)
view(autoenc2)
view(softnet)
%自编码器中的编码器已用于提取特征。可以将自编码器中的编码器与 softmax 层堆叠在一起,以形成用于分类的堆叠网络。
stackednet = stack(autoenc1,autoenc2,softnet);
% view 函数查看堆叠网络的图。该网络由自编码器中的编码器和 softmax 层构成。
view(stackednet)
%基于测试集计算结果。要将图像用于堆叠网络,必须将测试图像重构为矩阵。这可以通过先堆叠图像的各列以形成向量,然后根据这些向量形成矩阵来完成。
% 获取图片像素
imageWidth = 28;
imageHeight = 28;
inputSize = imageWidth*imageHeight;
% 加载测试图片
[xTestImages,tTest] = digitTestCellArrayData;% 堆叠图像的各列以形成向量,然后根据这些向量形成矩阵
xTest = zeros(inputSize,numel(xTestImages));
for i = 1:numel(xTestImages)xTest(:,i) = xTestImages{i}(:);
end
%使用混淆矩阵来可视化结果。矩阵右下角方块中的数字表示整体准确度。
y = stackednet(xTest);
plotconfusion(tTest,y);
%% 微调堆叠神经网络
%说明:通过对整个多层网络执行反向传播,可以改进堆叠神经网络的结果。此过程通常称为微调。
%通过以有监督方式基于训练数据重新训练网络来微调网络。将训练图像重构为矩阵,就像对测试图像所做的那样。
% 堆叠图像的各列以形成向量,然后根据这些向量形成矩阵
xTrain = zeros(inputSize,numel(xTrainImages));
for i = 1:numel(xTrainImages)xTrain(:,i) = xTrainImages{i}(:);
end
% 微调执行
stackednet = train(stackednet,xTrain,tTrain);
% 使用混淆矩阵再次查看结果。
y = stackednet(xTest);
plotconfusion(tTest,y);

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

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

相关文章

宝塔软件默认安装位置

自带的JDK /usr/local/btjdk/jdk8Tomcat 各个版本都在bttomcat这个文件夹下面,用版本区分。tomcat_bak8是备份文件 /usr/local/bttomcat/tomcat8nginx /www/server/nginxnginx配置文件存放目录 /www/server/panel/vhost/nginxredis /www/server/redismysql /…

nextjs(持续学习中)

return ( <p className{${lusitana.className} text-xl text-gray-800 md:text-3xl md:leading-normal}> Welcome to Acme. This is the example for the{’ } Next.js Learn Course , brought to you by Vercel. ); } 在顶级 /public 文件夹下提供静态资产 **默认 /…

央国企财务专家的“专家课”——中国总会计师协会联合实在智能举办RPA专项培训

近日&#xff0c;中国总会计师协会正式举办了为期五天的「财务数字化思维与实用IT技能提升」专项培训&#xff0c;吸引了来自中铁十五局集团有限公司、中国航空工业规划设计院、中核核电运行管理有限公司、中国北方车辆有限公司、一汽物流有限公司等国企、事业单位及民营企业共…

【权威出版/投稿优惠】2024年水利水电与能源环境科学国际会议(WRHEES 2024)

2024 International Conference on Water Resources, Hydropower, Energy and Environmental Science 2024年水利水电与能源环境科学国际会议 【会议信息】 会议简称&#xff1a;WRHEES 2024 大会时间&#xff1a;点击查看 截稿时间&#xff1a;点击查看 大会地点&#xff1a;…

【Linux】进程间通信3——system V共享内存

1.system V进程间通信 管道通信本质是基于文件的&#xff0c;也就是说操作系统并没有为此做过多的设计工作&#xff0c;而system V IPC是操作系统特地设计的一种通信方式。但是不管怎么样&#xff0c;它们的本质都是一样的&#xff0c;都是在想尽办法让不同的进程看到同一份由操…

压力应变桥信号变送光电隔离放大模块PCB焊接式 差分信号输入0-10mV/0-20mV/0-±10mV/0-±20mV转0-5V/0-10V/4-20mA

概述&#xff1a; IPO压力应变桥信号处理系列隔离放大器是一种将差分输入信号隔离放大、转换成按比例输出的直流信号混合集成厚模电路。产品广泛应用在电力、远程监控、仪器仪表、医疗设备、工业自控等行业。该模块内部嵌入了一个高效微功率的电源&#xff0c;向输入端和输出端…

【深度解析】1688货源拿货价比拼多多贵?为何商家仍选1688

对电商卖家来说&#xff0c;首先需要解决的问题就是货源。 虽然知道1688是个大型综合性的货源平台&#xff0c;但很多卖家还是觉得1688上面的货源很贵&#xff0c;甚至在平台严查无货源的背景下&#xff0c;还是坚持从1688拿货。那么为什么有些拼多多的商品会比1688还便宜呢&a…

openipc:/etc/init.d/目录下的所有启动文件启动分析

openipc /etc/init.d/目录下的所有文件 启动文件解析参考&#xff1a;https://blog.csdn.net/qq_37212828/article/details/107227965 1. rcS文件&#xff0c;是本目录在开机时最先启动的文件&#xff1a; 它会依次启动/etc/init.d/目录下依S开头的文件 #!/bin/sh # Start a…

探索线性回归模型

目录 一 线性回归的理论基础 什么是线性回归? 线性回归的假设 最小二乘法 二 线性回归的数学推导 线性回归参数的推导 多元线性回归 三 线性回归的模型构建 数据准备 训练模型 模型评估 四 线性回归的代码实现 基本实现 多元线性回归 五 线性回归的应用场景 预…

openh264 运动估计搜索原理源码分析

运动估计搜索 运动估计搜索是视频编码中的一个重要步骤&#xff0c;它用于确定视频序列中两个帧之间的运动向量&#xff08;MV&#xff09;。这些运动向量用于预测帧之间的运动&#xff0c;从而减少编码所需的数据量。以下是运动估计搜索的一些关键概念和步骤&#xff1a; 运动…

贪心算法——赶作业(C++)

慢慢来&#xff0c;沉稳一点。 2024年6月18日 题目描述 A同学有n份作业要做&#xff0c;每份作业有一个最后期限&#xff0c;如果在最后期限后交作业就会扣分&#xff0c;现在假设完成每份作业都需要一天。A同学想安排作业顺序&#xff0c;把扣分降到最低&#xff0c;请帮他实…

易备防勒索备份方案与成功案例

随着信息化的发展&#xff0c;数据安全的重要性愈加突出。据 Hiscox 全球网络安全统计&#xff0c;在勒索软件攻击事件当中&#xff0c;64%以上的用户是中小企业。因此&#xff0c;制定完善的灾备策略&#xff0c;是抵御网络威胁的终极方案。而在诸多数据备份方案中&#xff0c…

【Linux】进程控制1——进程创建和进程终止

1.进程创建 1.1.再谈fork 在linux中fork函数时非常重要的函数&#xff0c;它从已存在进程中创建一个新进程。新进程为子进程&#xff0c;而原进程为父进程。 #include <unistd.h> pid_t fork(void);//pid_t为整形 返回值&#xff1a;子进程中的fork()返回0&#xff…

内置类型不够用?试试Python内置类型子类化!

目录 1、经典继承法:直接子类化内置类型 🧬 1.1 了解Python内置类型 1.2 实现子类化的基础步骤 步骤1:定义子类 步骤2:添加自定义行为 步骤3:使用子类 1.3 实战:子类化列表list示例 1.4 优化:重写魔法方法实现自定义行为 2、高级技巧:元类介入定制 🪐 2.1 …

TCP/IP协议,三次握手,四次挥手,常用的协议

IP - 网际协议 IP 负责计算机之间的通信。 IP 负责在因特网上发送和接收数据包。 HTTP - 超文本传输协议 HTTP 负责 web 服务器与 web 浏览器之间的通信。 HTTP 用于从 web 客户端&#xff08;浏览器&#xff09;向 web 服务器发送请求&#xff0c;并从 web 服务器向 web …

智能门锁电池双节升压充电芯片-FP6291支持5V1A输入升压 8.4V双节电池充电

方案背景 可充电锂电池是一种环保、高效的智能锁电池类型&#xff0c;其主要优点是可以循环充电使用、容量大、使用寿命长。与一次性电池相比&#xff0c;可充电锂电池可以循环充电使用&#xff0c;减少了废弃物的产生和对环境的影响。同时&#xff0c;可充电锂电池的容量较大…

细说MCU输出互补型PWM波形的实现方法

目录 一、硬件及工程 二、建立工程 1、TIM1引脚 2、建立工程 &#xff08;1&#xff09;配置GPIO &#xff08;2&#xff09;选择时钟源和Debug模式 &#xff08;3&#xff09;配置定时器 &#xff08;4&#xff09;配置中断 &#xff08;5&#xff09;配置系统时钟 …

怎么去避免手机赚钱的骗局?

要避免手机赚钱的骗局&#xff0c;可以遵循以下一些建议&#xff1a; 1. 谨慎对待高收益承诺&#xff1a;如果一个项目承诺轻松获取高额回报&#xff0c;那么很可能存在风险。真正的高收益往往伴随着高风险&#xff0c;而且需要付出大量的努力和时间。 2. 调查了解相关项目&am…

【基因功能富集2:分析流程】非模式生物怎么注释 clusterProfiler包GO、KEGG

文章目录 概要整体流程step1 百度搜索注释物种--拉丁文名称step2 注释官网搜索--该物种对应库--编号step3 正常注释 即可 概要 不常见的物种如何进行富集分析&#xff1f;&#xff1f; 整体流程 提示&#xff1a; step1 百度搜索注释物种–拉丁文名称 提示&#xff1a;拉丁文…

Gobject tutorial 六

Instantiatable classed types Initialization and destruction 类型的实例化是通过函数g_tpye_create_instance()实现的。这个函数首先会查找与类型相关的GTypeInfo结构体&#xff0c;之后&#xff0c;查询结构体中的instance_size和 instance policy即 n_preallocs(在 2.10版…