MATLAB实战 利用1D-DCGAN生成光谱或信号数据

0.前言

        在光谱学或信号处理领域,获取大量高质量的数据可能是一项挑战。利用DCGAN迁移对抗生成光谱或信号数据,可以有效地增加数据集的多样性,提高模型的泛化能力。

        该实战项目提供了所有源代码与测试数据,旨在帮助学者快速地掌握了解利用DCGAN对1维数据的生成。

建议开始本项目前提前了解和掌握以下内容:MATLAB代码解析:利用DCGAN实现图像数据的生成 全网最细&DCGAN设计-训练入门

项目参考文献:

光谱技术结合水分校正与样本增广的棉田土壤盐分精准反演 - 中国知网

1.训练效果、脚本与文件

1.1训练效果

 训练8个周期

 训练36个周期

训练115个周期

充分训练后

1.2脚本代码

1.2.1主程序

数据获取
clear all
clc
load("TestData.mat");
%返回相同的数据类型,以行为分配样本
%'IterationDimension'=1以第一个维度划分样本(行),2为第二个维度,以此类推;
ADataStore = arrayDatastore(DataMat,'IterationDimension',1,'OutputType', 'cell');
%%构建生成器
numLatentInputs=200;%输入随机数大小
netG=Creat_1D_Gener(numLatentInputs);
%%判别器
netD=Creat_1D_Discri();
%%指定训练选项
dropoutProb = 0.25;%泄露率
scale = 0.2;
numEpochs = 2000;%训练周期
miniBatchSize = 256;%最小批次
learnRate = 0.00002;
learnRateD=0.00002;
gradientDecayFactor = 0.45;
squaredGradientDecayFactor = 0.999;
flipProb = 0.15;%翻转概率
validationFrequency = 100;%验证频率
%%训练模型
mbq = minibatchqueue(ADataStore, ...MiniBatchSize=miniBatchSize, ...MiniBatchFcn=@preprocessMiniBatch12_2D, ...%预处理方法,与采集的数据类型对应PartialMiniBatch="discard", ...MiniBatchFormat="SCB");trailingAvgG = [];
trailingAvgSqG = [];
trailingAvg = [];
trailingAvgSqD = [];
numValidationImages = 4;
ZValidation = randn(numLatentInputs,numValidationImages,"single");
ZValidation = dlarray(ZValidation,"CB");
if canUseGPUZValidation = gpuArray(ZValidation);
endf = figure;
f.Position(3) = 2*f.Position(3);imageAxes = subplot(1,2,1);
scoreAxes = subplot(1,2,2);C = colororder;
lineScoreG = animatedline(scoreAxes,Color=C(1,:));
lineScoreD = animatedline(scoreAxes,Color=C(2,:));
legend("Generator","Discriminator");
ylim([0 1])
xlabel("Iteration")
ylabel("Score")
grid oniteration = 0;
start = tic;% Loop over epochs.
for epoch = 1:numEpochs% Reset and shuffle datastore.shuffle(mbq);% Loop over mini-batches.while hasdata(mbq)iteration = iteration + 1;% Read mini-batch of data.X = next(mbq);% Generate latent inputs for the generator network. Convert to% dlarray and specify the format "CB" (channel, batch). If a GPU is% available, then convert latent inputs to gpuArray.Z = randn(numLatentInputs,miniBatchSize,"single");Z = dlarray(Z,"CB");if canUseGPUZ = gpuArray(Z);end% Evaluate the gradients of the loss with respect to the learnable% parameters, the generator state, and the network scores using% dlfeval and the modelLoss function.[~,~,gradientsG,gradientsD,stateG,scoreG,scoreD] = ...dlfeval(@modelLoss,netG,netD,X,Z,flipProb);netG.State = stateG;  %%show data%"epoch"%epoch%"scoreG-D"%[scoreG,scoreD]% Update the discriminator network parameters.[netD,trailingAvg,trailingAvgSqD] = adamupdate(netD, gradientsD, ...trailingAvg, trailingAvgSqD, iteration, ...learnRateD, gradientDecayFactor, squaredGradientDecayFactor);% Update the generator network parameters.[netG,trailingAvgG,trailingAvgSqG] = adamupdate(netG, gradientsG, ...trailingAvgG, trailingAvgSqG, iteration, ...learnRate, gradientDecayFactor, squaredGradientDecayFactor);% Every validationFrequency iterations, display batch of generated% images using the held-out generator input.if mod(iteration,validationFrequency) == 0 || iteration == 1% Generate images using the held-out generator input.XGeneratedValidation = predict(netG,ZValidation);% Tile and rescale the images in the range [0 1].I = imtile(extractdata(XGeneratedValidation));I = rescale(I);% Display the images.subplot(1,2,1);plot(I,'DisplayName','I')% xticklabels([0 900]);% yticklabels([-1 1]);title("Generated Curve");% Update the scores plot.subplot(1,2,2)scoreGV = double(extractdata(scoreG));addpoints(lineScoreG,iteration,scoreGV);scoreDV = double(extractdata(scoreD));addpoints(lineScoreD,iteration,scoreDV);% Update the title with training progress information.D = duration(0,0,toc(start),Format="hh:mm:ss");title(..."Epoch: " + epoch + ", " + ..."Iteration: " + iteration + ", " + ..."Elapsed: " + string(D))drawnow%周期性保存数据if mod(iteration,validationFrequency*100)==0%save GANmodel_test.mat netG netD trailingAvg trailingAvgSqD iterationendendend
end
%%生成新图像  
numLatentInputs = 50;
numObservations = 1;
ZNew = randn(numLatentInputs,numObservations,"single");
ZNew = dlarray(ZNew,"CB");
if canUseGPUZNew = gpuArray(ZNew);
endXGeneratedNew = predict(netG,ZNew);I = imtile(extractdata(XGeneratedNew));
I=rescale(I)
figure
plot(I,'DisplayName','I')
axis off
title("Generated Images")

该代码内容与之前图像生成的思路[1]基本一致,主要变动在于生成器、判别器、数据库构建和数据预处的区别。

[1] https://blog.csdn.net/m0_47787372/article/details/141791275?spm=1001.2014.3001.5501

首先是数据格式的变动,由于1D数据较小,这里直接用内存载入训练。

         该程序提供的示例数据为2维的doule类型(每行为1个样本),数据量3658、单样本长度128。这里利用,arrayDatastore函数直接从内存读取该数据作为深度学习的训练样本,'IterationDimension'为样本分割的维数,这里按行分割样本,固设置为1.OutputType设置成same或cell都可以。

ADataStore = arrayDatastore(DataMat,'IterationDimension',1,'OutputType', 'cell');

如果这里不使用arrayDatastore类函数,将无法使用minibatchqueue函数将数据拆分成多个训练批次。后者仅支持datastore数据类型,当然你使用imaginedatastore等其他函数也是可以的(把1维数据变成图像再训练),但这本质上属于还是未对matlab数据类型的实现精准掌握。

1.2.2 生成器 


function net=Creat_2D_Gener(numLatentInputs)
net = dlnetwork;Add branches to the dlnetwork. Each branch is a linear array of layers.
tempNet = [featureInputLayer(numLatentInputs,"Name","input")projectAndReshapeLayer([8 2048])transposedConv1dLayer(3,1024,"Name","transposed-conv1d","Cropping","same","Stride",2)instanceNormalizationLayer("Name","instancenorm")reluLayer("Name","relu")transposedConv1dLayer(3,512,"Name","transposed-conv1d_1","Cropping","same","Stride",2)instanceNormalizationLayer("Name","instancenorm_1")reluLayer("Name","relu_1")transposedConv1dLayer(3,256,"Name","transposed-conv1d_2","Cropping","same")instanceNormalizationLayer("Name","instancenorm_2")reluLayer("Name","relu_3")transposedConv1dLayer(3,128,"Name","transposed-conv1d_3","Cropping","same","Stride",2)instanceNormalizationLayer("Name","instancenorm_3")reluLayer("Name","relu_2")transposedConv1dLayer(3,64,"Name","transposed-conv1d_4","Cropping","same","Stride",2)instanceNormalizationLayer("Name","instancenorm_3_1")reluLayer("Name","relu_2_1")transposedConv1dLayer(1,1,"Name","transposed-conv1d_5","Cropping","same")tanhLayer("Name","tanh")];
net = addLayers(net,tempNet);clear tempNet;net = initialize(net);plot(net);end

生成器用的是1维转置卷积层,输入200个随机数,通过自定义的全连接reshape层将数据转化为8*2048的大小。利用Matlab的DL designer工具包进行分析,通过观察Activation属性,我们可以很快的了解数据在生成器中的变化。其中S为空间维度,C为通道维度,B为批次量(根据训练设置变化)。这里的设计的思路就是利用噪声生成一个通道数高的带加工样本,之后每次一维转置卷积中通道维度每减半、空间维度翻倍。最后加工为128*1(C)的1维数据。

其中,rehape自定义层代码如下,和图像生成的项目基本一致,但是输出格式进行了调整(SCB),该层就是将200个输入噪声通过全连接层变为8*2048长度的数据,再reshape成8*2048*1的SCB格式数据。

classdef projectAndReshapeLayer < nnet.layer.Layer ...& nnet.layer.Formattable ...& nnet.layer.Acceleratableproperties% Layer properties.OutputSizeendproperties (Learnable)% Layer learnable parameters.WeightsBiasendmethodsfunction layer = projectAndReshapeLayer(outputSize,NameValueArgs)% layer = projectAndReshapeLayer(outputSize)% creates a projectAndReshapeLayer object that projects and% reshapes the input to the specified output size.%% layer = projectAndReshapeLayer(outputSize,Name=name)% also specifies the layer name.% Parse input arguments.argumentsoutputSizeNameValueArgs.Name = "";end% Set layer name.name = NameValueArgs.Name;layer.Name = name;% Set layer description.layer.Description = "Project and reshape to size " + ...join(string(outputSize));% Set layer type.layer.Type = "Project and Reshape";% Set output size.layer.OutputSize = outputSize;endfunction layer = initialize(layer,layout)% layer = initialize(layer,layout) initializes the layer% learnable parameters.%% Inputs:%         layer  - Layer to initialize%         layout - Data layout, specified as a %                  networkDataLayout object%% Outputs:%         layer - Initialized layer% Layer output size.outputSize = layer.OutputSize;% Initialize fully connect weights.if isempty(layer.Weights)% Find number of channels.idx = finddim(layout,"C");numChannels = layout.Size(idx);% Initialize using Glorot.sz = [prod(outputSize) numChannels];numOut = prod(outputSize);numIn = numChannels;layer.Weights = initializeGlorot(sz,numOut,numIn);end% Initialize fully connect bias.if isempty(layer.Bias)% Initialize with zeros.layer.Bias = initializeZeros([prod(outputSize) 1]);endendfunction Z = predict(layer, X)% Forward input data through the layer at prediction time and% output the result.%% Inputs:%         layer - Layer to forward propagate through%         X     - Input data, specified as a formatted dlarray%                 with a "C" and optionally a "B" dimension.% Outputs:%         Z     - Output of layer forward function returned as%                 a formatted dlarray with format "SSCB".% Fully connect.weights = layer.Weights;bias = layer.Bias;X = fullyconnect(X,weights,bias);% Reshape.outputSize = layer.OutputSize;Z = reshape(X,outputSize(1),outputSize(2),[]);Z = dlarray(Z,"SCB");endend
end

1.2.3 判别器

判别器基本与生成器对称,用1维卷积核, 代码如下:


function net=Creat_1D_Discri(droprate,scale)
net = dlnetwork;tempNet = [inputLayer([128 1 NaN],"SCB","Name","input")dropoutLayer(droprate,"Name","dropout")convolution1dLayer(3,32,"Name","conv1d","Padding","same","Stride",2)leakyReluLayer(scale,"Name","leakyrelu_1")convolution1dLayer(3,64,"Name","conv1d_1","Padding","same","Stride",2)batchNormalizationLayer("Name","batchnorm")leakyReluLayer(scale,"Name","leakyrelu_2")convolution1dLayer(3,128,"Name","conv1d_2","Padding","same","Stride",2)batchNormalizationLayer("Name","batchnorm_1")leakyReluLayer(scale,"Name","leakyrelu_3")convolution1dLayer(3,256,"Name","conv1d_3","Padding","same","Stride",2)batchNormalizationLayer("Name","batchnorm_1_1")leakyReluLayer(scale,"Name","leakyrelu_3_1")convolution1dLayer(3,512,"Name","conv1d_4","Padding","same","Stride",2)batchNormalizationLayer("Name","batchnorm_1_2")leakyReluLayer(scale,"Name","leakyrelu_3_2")convolution1dLayer(5,1,"Name","conv1d_5","Padding","same","Stride",4)sigmoidLayer("Name","layer")];
net = addLayers(net,tempNet);% clean up helper variable
clear tempNet;net = initialize(net);plot(net);

具体参数如下

1.2.3数据预处理函数

 预处理函数有比较明显的改动,1个是本次示例数据是int12的格式,所以我们这里归一化范围修改了。其次是样本凭借的维度(批次维度)为3,需要注意。同时我们需要调整数据的维度顺序,因为arraydatastore按第一个维度分割样本后的数据格式为1*128*1(CSB),为了对应深度学习模型的输入维度(SCB),在预处理前利用permute函数进行维度调整。

function X = preprocessMiniBatch12_2D(data)% Concatenate mini-batch
X = cat(3,data{:});%调整矩阵的维度,让数值回到空间通道中,通道在第二位置;
X=permute(X, [2, 1, 3]); 
% Rescale the images in the range [-1 1].
X = rescale(X,-1,1,InputMin=0,InputMax=2^12);end

1.2.4 损失函数

无大变化:

反向传播与梯度计算

function [lossG,lossD,gradientsG,gradientsD,stateG,scoreG,scoreD] = ...modelLoss(netG,netD,X,Z,flipProb)% Calculate the predictions for real data with the discriminator network.
YReal = forward(netD,X);
% Calculate the predictions for generated data with the discriminator
% network.
[XGenerated,stateG] = forward(netG,Z);
YGenerated = forward(netD,XGenerated);% Calculate the score of the discriminator.
scoreD = (mean(YReal) + mean(1-YGenerated)) / 2;% Calculate the score of the generator.
scoreG = mean(YGenerated);% Randomly flip the labels of the real images.
numObservations = size(YReal,4);
idx = rand(1,numObservations) < flipProb;
YReal(:,:,:,idx) = 1 - YReal(:,:,:,idx);% Calculate the GAN loss.
[lossG, lossD] = ganLoss(YReal,YGenerated);% For each network, calculate the gradients with respect to the loss.
gradientsG = dlgradient(lossG,netG.Learnables,RetainData=true);
gradientsD = dlgradient(lossD,netD.Learnables);end

损失函数:

function [lossG,lossD] = ganLoss(YReal,YGenerated)% Calculate the loss for the discriminator network.
lossD = -mean(log(YReal)) - mean(log(1-YGenerated));% Calculate the loss for the generator network.
lossG = -mean(log(YGenerated));end

1.3 资源下载

脚本、函数文件与示例数据如下:

通过网盘分享的文件:24-1D_DCGAN_EXAMPLE.zip
链接: https://pan.baidu.com/s/1kxQ4Q3RCzLeeAgdQBWl9KQ?pwd=3wgy 提取码: 3wgy 

2.总结

   从信息论的角度进行分析,DCGAN 在基于先验知识(真实样本)的条件下尽可能地生成接 近真实的样本,这一过程并不会创造新信息,无法通过对抗过程来增加训练集基本特征的多样性。但对于样本 多样性而言,DCGAN具有基于现有特征进行缩放及组 合以形成更多具有特异性高级特征的能力,因此它具有强化预测模型的泛化能力的潜力,提高模型对特征挖掘和学习能力,但这也导致DCGAN在过少的训练集(基本特征不足)或足够丰富的训练集(高级特征充足)的场景下, 很难带来显著的预测性能效果提升[2].  

[2] 光谱技术结合水分校正与样本增广的棉田土壤盐分精准反演 - 中国知网

   该项目详细展示和分析了在MATLAB中利用DCGAN生成1D数据的方法和注意事项,欢迎大家进行交流。

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

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

相关文章

华为:hcia综合实验

一、拓扑图 二、实验要求 1. pc地址请自行规划&#xff0c;vlan已给出 2. 服务器地址自行规划&#xff0c;vlan&#xff0c;网段已给出 3. 交换机互联链路捆绑保证冗余性 4. 内网pc网关集中于核心交换机&#xff0c;交换机vlan 40互联路由器 ,地址网段已给出 5.配置静态路由实…

jenkins流水线pipeline

创建项目 1. 新建item 并选择pipeline 1.1 和普通项目配置的区别 普通项目配置目录&#xff1a; pipeline项目目录&#xff1a; pipeline的两种语法 声明式语法 2. 配置 2.1 流水线配置 2.2 选择声明式 声明式需要添加一个名为Jenkinsfile的文件实现流水线 Jenkinsfile的…

微信小程序自定义tabbar;禁用某个tab;修改某个tab的样式

微信小程序自定义tabbar&#xff1b;禁用某个tab&#xff1b;修改某个tab的样式 原本使用本身的tabBar就已经很舒服了&#xff0c;很合适了的&#xff0c;但是总有一些脑洞大开的产品和客户&#xff0c;给你搞点多样式&#xff0c;没办法牛马就得去做咯&#xff0c;现在就给大…

深入浅出rust内存对齐

在 Rust 中&#xff0c;内存对齐是一个重要的概念&#xff0c;它涉及到数据在内存中的存储方式&#xff0c;以及如何优化内存访问的效率。往往一门语言的内存布局以及对齐方式决定了一门语言的性能&#xff0c;因此学会并深入理解rust中内存布局会让我们写出高性能的rust代码&a…

闯关leetcode——3206. Alternating Groups I

大纲 题目地址内容 解题代码地址 题目 地址 https://leetcode.com/problems/alternating-groups-i/description/ 内容 There is a circle of red and blue tiles. You are given an array of integers colors. The color of tile i is represented by colors[i]: colors[i…

HTML5和CSS3的进阶_HTML5和CSS3的新增特性

目录 HTML5的新特性 1. HTML5 的新特性 1.1 HTML5 新增的语义化标签 1.2 HTML5 新增的多媒体标签 1. 视频 2. 音频 3. 多媒体标签总结 1.3 HTML5 新增的 input 类型 1.4 HTML5 新增的表单属性 required 必须输入信息&#xff0c;不能为空&#xff1b; 重点&#xf…

小马识途营销顾问谈百科词条建立的注意事项

百度百科是百度旗下的产品&#xff0c;它就好比是一本网络百科全书&#xff0c;当我们在网络上搜索某个人物或是企业的时候&#xff0c;如果他们有创建百度百科的话就可以搜出来百度百科词条。词条上展示的荣誉、贡献、社会评价或是企业组织架构等方面可以在无形之中提升人物或…

6、If、While、For、Switch

6、If、While、For、Switch 一、If 1、if-else if (boolean) {代码块 } else if (boolean) {代码块 } else if (boolean) {代码块 } else { // 默认情况代码块 }关于IDEA单元测试控制台不能输入数据的问题&#xff1a; https://blog.csdn.net/m0_72900498/article/details/…

华为路由器DHCP配置

一、单臂路由结构的DHCP 1.启动设备 2.将pc设为DHCP获取IP地址 3.交换机创建vlan并设置模式 [SW1]vlan batch 10 20 [SW1]int g0/0/1 [SW1-GigabitEthernet0/0/1]port link-type trunk [SW1-GigabitEthernet0/0/1]port trunk allow-pass vlan all [SW1-GigabitEthernet0…

【Vue】Vue3.0(十七)Vue 3.0中Pinia的深度使用指南(基于setup语法糖)

上篇文章&#xff1a; 【Vue】Vue3.0&#xff08;十一&#xff09;Vue 3.0 中 computed 计算属性概念、使用及示例 &#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;Vue专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年11月10日15点23分 文章…

element plus el-form自定义验证输入框为纯数字函数

element plus 的el-form 使用自定义验证器&#xff0c;验证纯数字&#xff0c;禁止输入小数、中文、字母、特殊符号。input的maxlength为最大输入多少位长度 效果图 <el-form ref"dataFormRef" :model"dataForm" :rules"dataRules" label-w…

SwiftUI(十)- 列表(分组,折叠)

引言 SwiftUI中的List组件不仅可以用户创建简单的列表&#xff0c;和UITableView一样&#xff0c;它也支持分组和折叠功能&#xff0c;让数据展示更具层次感。通过分组功能&#xff0c;我们可以将数据按照特定的逻辑进行组织&#xff0c;而折叠则为用户提供了更为紧凑的界面体…

链表(Linkedlist)

序言 我们都了解链表是一种数据的存储结构&#xff0c;在Java使用中逻辑与c&#xff0c;c语言数据结构别无二致&#xff0c;但主要由于Java中不存在指针的说法&#xff0c;从而导致在实现过程中的代码不同&#xff0c;所以在学习的过程中我们无需过于担心&#xff0c;逻辑都是…

JS之正则表达式

一、什么是正则表达式 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </…

MySQL数据库:本地部署数据库以及安装彩虹猫【Navicat】

文章目录 一.安装前准备工作1.下载并解压文件2.修复电脑缺失的文件 二.本地部署MySQL1.先解压mysql-8.0.25-winx64.zip&#xff0c;并把文件放到安装需要的位置&#xff0c;再把my.ini文件放到mysql-8.0.25-winx64的根目录2.修改注册表的根目录信息为自己的安装装路径3.进命令符…

11个简单易用的电商购物车设计案例

文章目录 前言正文1.扁平化设计购物车2.无表格布局购物车3.美食购物车4.响应式购物车5.jQuery购物车6.动态价格更新购物车7.标签式滑动购物车8.动态商店与购物车一体化设计9.简约清爽的购物车设计10.基于Vue.js的购物车11.域名购物车 总结 前言 现在的电子商务网站&#xff0c…

Stable Diffusion Web UI - ControlNet 姿势控制 openpose

openpose 是 ControlNet 中常用的控制模式之一。 通过 openpose 可以锁定人物姿势&#xff0c;把姿势信息传递给 Stable Diffusion 扩散模型&#xff0c;让其在扩散生成图片的时候遵照特定的任务姿势。 通过 openpose 能够得到类似如下效果&#xff1a; 同样的姿势&#xff0…

Word2Vec,此向量维度,以及训练数据集单条数据的大小,举例说明;Skip-gram模型实现词嵌入;热编码(One-Hot Encoding)和词向量;

目录 Word2Vec Word2Vec,此向量维度,以及训练数据集单条数据的大小,举例说明 一、Word2Vec的词向量维度 二、训练数据集单条数据的大小 综上所述 热编码(One-Hot Encoding)和词向量 一、表示方式 二、维度与计算效率 三、语义捕捉能力 四、举例说明 Skip-gram模…

大模型预训练+微调大模型;大模型提示/指令模式”(Prompt/Instruct Mode)

目录 大模型发布版本 大模型参数量 预训练+微调大模型 预训练大模型的优势 微调的概念与过程 微调的优势 应用场景与案例 提示/指令模式”(Prompt/Instruct Mode) Prompt模式与Instruct模式的区别与联系 Prompt/Instruct模式的应用优势 应用案例 大模型发布版本 大…

WPF在MVVM模式下怎么实现导航功能

在mvvm的模式下wpf通过frame实现页面跳转_哔哩哔哩_bilibili 视频讲解同步可观看 如下图&#xff0c;我们要实现点击左侧的菜单&#xff0c;在右侧展示不同的页面 实现代码如下&#xff1a; 一、如何从主窗体跳转到页面。 1、在mainwindow.xaml的菜单栏代码里加入如下代码 …