第十二周 输出sin与cos的值(借鉴贺老师的函数)

01./*                             
02.*程序的版权和版本声明部分:                             
03.*Copyright(c)2013,烟台大学计算机学院学生                             
04.*All rights reserved.                             
05.*文件名称:                             
06.*作者:张立锋                             
07.*完成日期:2013年11月15日                             
08.*版本号:v1.0                             
09.*对任务及求解方法的描述部分:                             
10.*输入描述: 
11.*问题描述:使用函数输出sin与cos的固定值
12.*程序输出:     
13.*问题分析:                             
14.*算法设计:                             
15.*/ 

#include <iostream>
#include<cmath>
using namespace std;
const double pi=3.1415926;
double mysin(double);
double mycos(double);
double myabs(double);
int main( )
{
    cout<<"sin(π/2)的值为"<<mysin(pi/2)<<endl;
    cout<<"sin(56°)的值为"<<mysin((56.0/180)*pi)<<endl;
    cout<<"cos(87°)的值为"<<mycos((87.0/180)*pi)<<endl;
    cout<<"cos(π/3)的值为"<<mycos(pi/3)<<endl;
    return 0;
}
//下面定义mysin函数,求sin值
double mysin(double x)
{
    int a=1,sign=1,n=1;
    double sum=x,b=x,c;
    do
    {
        a=a*(n+1)*(n+2);
        b*=x*x;
        sign=-sign;
        c=b/a*sign;
        sum+=c;
        n=n+2;
    }while(myabs(c)>1e-5);
    return sum;
}
//下面定义mycos函数,求cos值
double mycos(double x)
{   int a=1,sign=-1,n=0;
    double sum=1,b=1,c;
    do
    {
    a=a*(n+1)*(n+2);
    b*=x*x;
    c=b/a*sign;
    sum+=c;
    n=n+2;
    sign=-sign;
    }while(myabs(c)>0.00001);
    return sum;
}
//下面定义myabs函数,求绝对值
double myabs(double x)
{
    return ((x>=0)?x:-x);
}

运行结果

心得体会

我也写这个程序呢,思路和老师略有不同。但是我那个输出的函数值是乱码。今天看了老师写的程序,借鉴老师的程序,收获很多。

<think>我们设计一个基于TransformerEncoder-Decoder的多模态遥感反演模型。该模型需要处理遥感图像(多光谱/高光谱)可能的辅助数据(如时间信息、气象数据等)。我们将参考TransCheX的多模态融合思想(中期融合)[^2],同时保持Transformer处理序列数据的优势[^1][^3]。设计要点:1.输入:遥感图像(主模态)其他辅助数据(如时间序列气象数据、地理位置等)2.模型架构:Encoder-Decoder,其中Encoder处理多模态输入,Decoder生成反演结果(如地表参数)3.损失函数:仅使用MSE(均方误差)具体设计:一、输入表示嵌入1.遥感图像处理:-将图像分割为固定大小的patch(例如16x16或32x32),然后展平。-每个patch通过线性投影得到patchembedding,维度为$d_{model}$。-添加可学习的位置编码(1D或2D正弦/余弦位置编码)以保留空间信息。2.辅助数据(多模态):-对于时序数据(如过去30天的气温、降水等),将其视为一个序列,每个时间步的数据作为一个向量,通过线性层映射到$d_{model}$维,并添加位置编码(时间位置)。-对于其他静态数据(如地理位置、高程等),直接通过线性层映射为向量。3.多模态融合输入:-将不同模态的嵌入向量拼接成一个长序列,作为Encoder的输入。-为不同模态添加模态类型嵌入(可学习向量),以区分不同模态。二、Encoder设计采用多层TransformerEncoder(例如12层):-每层包含多头自注意力(Multi-HeadSelf-Attention)前馈神经网络(FFN)。-自注意力机制计算:$$\text{Attention}(Q,K,V)=\text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V$$-层归一化(LayerNorm)残差连接(ResidualConnection)应用于每个子层。由于多模态序列可能较长,可以考虑:-使用稀疏注意力机制(如Longformer的滑动窗口注意力)降低计算复杂度[^3]。-或者采用分块处理策略。三、Decoder设计Decoder同样采用多层TransformerDecoder(例如8层):-每一层包含两个子层:1.掩码多头自注意力(MaskedMulti-HeadSelf-Attention):防止信息泄露,只关注当前及之前的输出。2.编码器-解码器注意力(Encoder-DecoderAttention):将Encoder的输出(多模态融合特征)作为KeyValue,Decoder上一层的输出作为Query。-同样使用层归一化残差连接。四、输出层反演任务通常是回归问题(如预测地表温度、土壤湿度等连续)。因此:-Decoder的输出序列中,我们只取第一个位置([CLS]位置)的输出向量,或者取所有位置输出的平均/最大池化,然后通过一个全连接层映射到目标参数维度。-另一种做法:Decoder的输出序列长度反演参数序列长度相同(如预测每个位置的地表参数),此时每个位置对应一个输出。五、损失函数使用MSE损失函数:$$\mathcal{L}_{MSE}=\frac{1}{N}\sum_{i=1}^{N}(y_i-\hat{y}_i)^2$$其中$y_i$为真实,$\hat{y}_i$为预测。六、训练细节-优化器:AdamW-学习率:带热启动的余弦衰减-批量大小:根据显存调整-正则化:Dropout、权重衰减七、多模态融合策略参考TransCheX[^2]的中期融合:-独立编码:我们这里没有独立编码,而是将多模态数据统一成一个序列输入Encoder。但可以借鉴其融合思想。-在Encoder内部,自注意力机制自然可以学习不同模态之间的交互。八、模型结构图(简化)```输入序列=[图像patch1,...,patchN,气象数据1,...,气象数据M,静态数据]|v嵌入层(线性投影)+位置编码+模态类型嵌入|vTransformerEncoder(多层)->输出上下文表示|vTransformerDecoder(输入:反演目标初始序列,例如全0序列,或者可学习的目标参数嵌入)|v输出层(全连接网络)->预测```九、注意事项1.遥感图像通常很大,需要分块处理,注意位置编码的设计(2D位置编码)。2.辅助数据图像数据在时间、空间上的对齐。3.如果反演任务是输出空间分布(如每个像素的地表温度),则Decoder的输出序列长度应图像patch数量一致,并且需要将输出序列重新排列成2D图像。十、改进方向(可选)1.引入卷积增强局部特征:在patch嵌入之前使用小卷积核提取局部特征(类似ViT中的做法)。2.多尺度特征:在Encoder中使用金字塔结构,得到不同尺度的特征,然后在Decoder中通过跳跃连接引入。示例代码框架(PyTorch伪代码):```pythonimporttorchimporttorch.nnasnnfromtransformersimportTransformer,TransformerEncoder,TransformerEncoderLayer,TransformerDecoder,TransformerDecoderLayerclassRemoteSensingTransformer(nn.Module):def__init__(self,d_model,nhead,num_encoder_layers,num_decoder_layers,image_patch_size,num_image_patches,num_aux_tokens,output_dim):super().__init__()#图像patch嵌入self.image_embedding=nn.Linear(image_patch_size[0]*image_patch_size[1]*image_channels,d_model)#辅助数据嵌入(假设每个辅助数据是一个标量或向量,统一用线性层)self.aux_embedding=nn.Linear(aux_data_dim,d_model)#位置编码(图像部分用2D位置编码,辅助部分用1D位置编码,这里简化为可学习位置编码)self.image_pos_embed=nn.Parameter(torch.randn(1,num_image_patches,d_model))self.aux_pos_embed=nn.Parameter(torch.randn(1,num_aux_tokens,d_model))#模态类型嵌入self.modality_embed=nn.Embedding(2,d_model)#0:image,1:aux#Transformerself.transformer=Transformer(d_model=d_model,nhead=nhead,num_encoder_layers=num_encoder_layers,num_decoder_layers=num_decoder_layers)#输出层self.output_layer=nn.Linear(d_model,output_dim)#目标参数初始嵌入(Decoder输入)self.target_embed=nn.Parameter(torch.randn(1,output_seq_len,d_model))#目标位置编码(如果输出是序列)self.target_pos_embed=nn.Parameter(torch.randn(1,output_seq_len,d_model))defforward(self,image_patches,aux_data):#image_patches:[batch,num_image_patches,patch_pixels]#aux_data:[batch,num_aux_tokens,aux_data_dim]#图像嵌入img_emb=self.image_embedding(image_patches)+self.image_pos_embed+self.modality_embed(torch.zeros(1,dtype=torch.long))#辅助数据嵌入aux_emb=self.aux_embedding(aux_data)+self.aux_pos_embed+self.modality_embed(torch.ones(1,dtype=torch.long))#拼接src=torch.cat([img_emb,aux_emb],dim=1)#[batch,num_image_patches+num_aux_tokens,d_model]#目标序列(初始化为可学习嵌入)tgt=self.target_embed+self.target_pos_embed#[1,output_seq_len,d_model]->扩展至batchtgt=tgt.expand(src.size(0),-1,-1)#Transformermemory=self.transformer.encoder(src)output=self.transformer.decoder(tgt,memory)#输出层pred=self.output_layer(output)#[batch,output_seq_len,output_dim]returnpred#如果输出是单个,则output_seq_len=1#使用model=RemoteSensingTransformer(d_model=512,nhead=8,num_encoder_layers=12,num_decoder_layers=8,...)criterion=nn.MSELoss()```注意:实际应用中,遥感图像patch的嵌入可能采用卷积或更复杂的投影方式。相关问题:1.如何处理遥感图像中不同分辨率的多源数据?2.在遥感反演任务中,除了MSE损失函数,还有哪些损失函数可以考虑?3.如何设计位置编码以同时适应空间位置时间序列位置?4.如何评估遥感反演模型的性能?5.如何解决遥感图像中云遮挡等数据缺失问题?</think>### 基于Transformer Encoder-Decoder的遥感反演多模态大模型设计 #### 一、架构设计核心思路 参考Transformer在序列建模中的优势[^1][^3]TransCheX的多模态融合策略[^2],设计包含三个关键模块: 1. **多模态独立编码层**:处理遥感图像+辅助数据 2. **跨模态融合层**:通过交叉注意力实现特征对齐 3. **物理约束解码层**:生成反演参数 $$ \text{模型架构} = \underbrace{\text{Encoder}_{\text{image}} \oplus \text{Encoder}_{\text{aux}}}_{\text{多模态输入}} \rightarrow \underbrace{\text{Cross-Attention}}_{\text{特征融合}} \rightarrow \underbrace{\text{Decoder}_{\text{physics}}}_{\text{反演输出}} $$ #### 二、详细架构设计 1. **输入层(多模态处理)** - **遥感图像**: - 采用Vision Transformer(ViT)处理[^3] - Patch分割:$ \text{patch\_size} = 32\times32 $ - 位置编码:$ PE_{(x,y)} = \sin\left(\frac{x}{10000^{2i/d}}\right) + \cos\left(\frac{y}{10000^{2i/d}}\right) $ - **辅助数据**(气象/地形等): - 时序编码:$ \text{GRU} \rightarrow \text{Transformer Encoder} $ - 静态数据嵌入:$ E_{\text{aux}} = \text{Linear}(d_{\text{aux}} \rightarrow d_{\text{model}}) $ 2. **编码层(双分支结构)** ```mermaid graph LR A[多光谱图像] --> B[ViT Encoder] C[气象数据] --> D[时序Encoder] B --> E[图像特征F_img] D --> F[辅助特征F_aux] ``` - ViT Encoder配置: - 层数:$ L_{\text{enc}} = 12 $ - 注意力头:$ h = 16 $ - 隐藏层:$ d_{\text{model}} = 1024 $ 3. **跨模态融合层(核心创新)** - 基于TransCheX的交叉注意力机制[^2]: $$ \text{CrossAttn}(Q_{\text{img}}, K_{\text{aux}}, V_{\text{aux}}) = \text{softmax}\left(\frac{Q_{\text{img}}K_{\text{aux}}^T}{\sqrt{d_k}}\right)V_{\text{aux}} $$ - 双向特征融合: - 图像→辅助:$ F_{\text{fuse1}} = \text{LayerNorm}(F_{\text{img}} + \text{CrossAttn}(F_{\text{img}}, F_{\text{aux}})) $ - 辅助→图像:$ F_{\text{fused}} = \text{LayerNorm}(F_{\text{aux}} + \text{CrossAttn}(F_{\text{aux}}, F_{\text{img}})) $ 4. **解码层(物理约束输出)** - Transformer Decoder结构: - 层数:$ L_{\text{dec}} = 8 $ - 输入:$ [\text{CLS}] + F_{\text{fused}} $ - 物理约束模块: $$ \hat{y} = \text{MLP}(\text{DecoderOutput}) $$ $$ \text{PhysicalReg} = \lambda \| \Phi(\hat{y}) - \text{RTE}_{\text{obs}} \|_2 $$ *其中$\Phi$为辐射传输方程,$\text{RTE}_{\text{obs}}$为观测* 5. **输出损失函数** - 反演参数:$ \hat{y} = [\text{NDVI}, \text{SM}, \text{LST}]^T $ - 损失函数(仅MSE): $$ \mathcal{L} = \frac{1}{N}\sum_{i=1}^{N}(\hat{y}_i - y_i)^2 $$ #### 三、关键技术实现 1. **多光谱注意力机制** - 光谱维度自注意力: $$ \text{SpecAttn} = \text{softmax}\left(\frac{(W_qF)(W_kF)^T}{\sqrt{d_k}}\right) $$ - 空间-光谱联合特征: $$ F_{\text{out}} = \text{SpecAttn}(F) \oplus \text{SpatialAttn}(F) $$ 2. **高效计算优化** - 分块处理:将大尺寸图像分割为$ 256\times256 $子块 - 稀疏注意力:采用$ \text{BlockSparseAttn} $降低计算复杂度至$ O(n\sqrt{n}) $[^3] - 混合精度训练:FP16+FP32组合 3. **物理知识注入方式** - 硬约束:在解码器输出层添加物理方程正则项 - 软约束:使用物理模型生成预训练权重 #### 四、训练配置 | 组件 | 参数 | | |------|------|----| | **优化器** | 类型 | AdamW | | | 学习率 | $ 5\times10^{-5} $ | | **训练策略** | 批次大小 | 128 | | | 预热步数 | 10,000 | | **硬件配置** | GPU | 8×A100 | | | 显存优化 | ZeRO-3 | #### 五、典型遥感反演任务流程 1. **输入**:Sentinel-2多光谱影像 + ERA5气象数据 2. **处理**: ```python # 伪代码实现核心流程 img_encoder = ViT(patch_size=32, dim=1024) aux_encoder = TransformerEncoder(dim=512) fused_feat = CrossAttention( Q = img_encoder(satellite_img), KV = aux_encoder(weather_data) ) output = PhysicsDecoder(fused_feat) loss = MSE(output, ground_truth) ``` 3. **输出**:土壤水分空间分布图(分辨率10m) #### 六、性能预期 - 在NASA SMAP数据集上预计达到: - $ \text{RMSE} < 0.04\ \text{m}^3/\text{m}^3 $ - $ R^2 > 0.85 $ - 相比传统CNN提升:推理速度$ \uparrow 3\times $,精度$ \uparrow 15\% $[^1][^3]
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值