LLAMA3中文语料 fine tune 测试与比对

概述:

Meta开发并发布了Meta-Lama 3大语言模型家族(LLM),Llama 3指令调优模型针对对话用例进行了优化,在常见的行业基准上优于许多可用的开源聊天模型。本文尝试对LLAMA3 在中文语料中尝试进行fine tune 为后续对 通义千问的模型进行比较。

代码实现:

加载依赖

from datasets import load_dataset
from transformers import (AutoModelForCausalLM,AutoTokenizer,BitsAndBytesConfig,HfArgumentParser,AutoTokenizer,TrainingArguments,Trainer,GenerationConfig
)
from tqdm import tqdm
from trl import SFTTrainer
import torch
import time
import pandas as pd
import numpy as np
from huggingface_hub import interpreter_login
from datasets import Dataset, DatasetDict
from functools import partial
from peft import LoraConfig, get_peft_model, prepare_model_for_kbit_training
import os
# 禁用权重和偏差
os.environ['WANDB_DISABLED']="true"

数据加载

git clone https://www.modelscope.cn/datasets/DAMO_NLP/lcsts_test_set.git

data_train_pth ='../Fine-tune/data/lcsts_test_set/{}'.format('train.csv')
data_train = pd.read_csv(data_train_pth)data_test_pth = '../Fine-tune/data/lcsts_test_set/{}'.format('test.csv')
data_test = pd.read_csv(data_test_pth)print(data_train.shape)
print(data_test.shape)#这里看到原本的训练集合很大 减少部分的训练集以便更快的看到结果
data_train = data_train.head(2000)data_train = Dataset.from_pandas(data_train)
data_test = Dataset.from_pandas(data_test)print(data_train)

(100000, 2)
(725, 2)

Dataset({
features: [‘text1’, ‘text2’],
num_rows: 2000
})

模型加载

compute_dtype = getattr(torch, "float16")
bnb_config = BitsAndBytesConfig(load_in_4bit=True,bnb_4bit_quant_type='nf4',bnb_4bit_compute_dtype=compute_dtype,bnb_4bit_use_double_quant=False,)
model_name=r'D:\临时模型\Meta-Llama-3-8B-Instruct'
device_map = {"": 0}
original_model = AutoModelForCausalLM.from_pretrained(model_name, device_map=device_map,quantization_config=bnb_config,trust_remote_code=True,use_auth_token=True)tokenizer = AutoTokenizer.from_pretrained(model_name,trust_remote_code=True,padding_side="left",add_eos_token=True,add_bos_token=True,use_fast=False)
tokenizer.pad_token = tokenizer.eos_token

数据预处理

#处理的是中文,所以添加中文的提示工程
def create_prompt_formats(sample):"""格式化示例的各个字段('instruction','output')然后使用两个换行符将它们连接起来:参数sample:样本字典"""ROLE_PROMPT = "你是一个文本记录员,擅长归纳文章的内容。"#校色说明INTRO_BLURB = " 需要将了解到的内容进行总结概括并输出。尽可能用最少得字来完事内容的概述"#任务简介INSTRUCTION_KEY = "### 要求:总结以下对话。"RESPONSE_KEY =  "### 总结:"END_KEY = "### 结束"blurb = f"\n{INTRO_BLURB}"instruction = f"{INSTRUCTION_KEY}"input_context = f"{sample['text1']}" if sample["text1"] else Noneresponse = f"{RESPONSE_KEY}\n{sample['text2']}"end = f"{END_KEY}"parts = [part for part in [blurb, instruction, input_context, response, end] if part]formatted_prompt = "\n\n".join(parts)sample["text"] = formatted_promptreturn sampledef get_max_length(model):conf = model.configmax_length = Nonefor length_setting in ["n_positions", "max_position_embeddings", "seq_length"]:max_length = getattr(model.config, length_setting, None)if max_length:print(f"Found max lenth: {max_length}")breakif not max_length:max_length = 1024print(f"Using default max length: {max_length}")return max_lengthdef preprocess_batch(batch, tokenizer, max_length):"""token处理"""return tokenizer(batch["text"],max_length=max_length,truncation=True,)def preprocess_dataset(tokenizer: AutoTokenizer, max_length: int,seed, dataset):"""格式化并标记它,以便为培训做好准备参数标记器(AutoTokenizer):模型标记器:param max_length (int):从标记器发出的标记的最大数量"""# 在每个示例中添加提示print("开始数据预处理...")dataset = dataset.map(create_prompt_formats)#, batched=True)# 对每一批数据集&进行预处理_preprocessing_function = partial(preprocess_batch, max_length=max_length, tokenizer=tokenizer)dataset = dataset.map(_preprocessing_function,batched=True,remove_columns=['text1', 'text2'],)# 过滤掉input_ids超过max_length的样本dataset = dataset.filter(lambda sample: len(sample["input_ids"]) < max_length)# 打乱数据dataset = dataset.shuffle(seed=seed)return dataset
## 开始处理数据
max_length = get_max_length(original_model)
print(max_length)seed=123train_data = preprocess_dataset(tokenizer, max_length,seed, data_train)
eval_data = preprocess_dataset(tokenizer, max_length,seed, data_test)

Found max lenth: 8192
8192

模型参数调整

output_dir = f'./LLAMA_peft-dialogue-summary-training-{str(int(time.time()))}'
peft_config = LoraConfig(lora_alpha=16, lora_dropout=0.1,r=64,bias="none",#target_modules="all-linear",task_type="CAUSAL_LM",#inplace=False,target_modules=['q_proj','k_proj','v_proj','dense'],
)training_arguments = TrainingArguments(output_dir=output_dir,                    # 保存训练日志和检查点的目录num_train_epochs=5,                       # 为其训练模型的历元数。一个epoch通常指的是通过整个训练数据集一次的前向传播和反向传播过程。#num_train_epochs 被设置为3,意味着模型将完整地遍历训练数据集3次。per_device_train_batch_size=1,            # 每个设备上每个批次的样本数。gradient_accumulation_steps=8,            #  执行向后/更新过程之前的步骤数gradient_checkpointing=True,              # 使用渐变检查点保存内存optim="paged_adamw_8bit",                 #"paged_adamw_8bit"/"paged_adamw_32bit" 用于训练模型的优化器save_steps=400,logging_steps=400,                         # 记录训练指标的步骤数。它被设置为50,意味着每50个训练步骤,训练指标将被记录一次。learning_rate=2e-4,                       # 学习率weight_decay=0.001,fp16=True,bf16=False,max_grad_norm=0.3,                        # 基于QLoRA的最大梯度范数max_steps=2000, #1000,                     #这个建议设置上,不然会出现很多次的训练轮warmup_ratio=0.03,                        # 基于QLoRA的预热比group_by_length=True,lr_scheduler_type="cosine",               # 使用余弦学习率调度report_to="tensorboard",                  # 向tensorboard报告指标  可选"none"evaluation_strategy="epoch",               # 每个纪元保存检查点 可选"steps" 这个参数设置了评估策略。#代码中设置为"epoch",意味着评估将在每个epoch结束后进行。由于eval_steps也设置为50,这可能意味着评估将在每50个训练步骤或每个epoch#warmup_steps = 1#logging_dir="./logs",#save_strategy="steps",eval_steps=200,#意味着每50个训练步骤,模型将在验证集上进行一次评估。do_eval=True,overwrite_output_dir  =True
)
"""
上述参数,模型将在以下情况下停止训练:完成3个epoch的训练,无论eval_steps条件是否满足。
如果训练数据集的大小导致在3个epoch内无法达到50个训练步骤,那么模型将在完成所有训练步骤后停止。
至于评估输出,由于logging_steps和eval_steps都设置为50,这意味着:每50个训练步骤,训练指标将被记录一次。
每50个训练步骤,模型将在验证集上进行一次评估。
"""#training_arguments.config.use_cache = False
#transformers.Trainer
"""
transformers.Trainer:如果你有一个大的数据集,并且需要为你的培训循环或复杂的培训工作流程进行广泛的定制。
使用SFTTrainer:如果你有一个预训练的模型和相对较小的数据集,并且想要更简单、更快的微调体验和高效的内存使用。如果训练数据集较小,可能导致在每个epoch中训练步骤数少于50步,那么eval_steps条件可能不会触发,评估将在每个epoch结束后根据evaluation_strategy参数的设置进行。另外,max_steps参数通常用于设置训练的最大步骤数,以防止训练超过预定的epoch数。
代码中,max_steps被设置为1000,这个值远大于由num_train_epochs和per_device_train_batch_size参数隐式定义的训练步骤数。
因此,除非训练数据集非常大,否则这个参数在上下文中可能不会起作用。
如果max_steps的值大于完成所有epoch所需步骤数的总和,训练将在完成所有epoch后停止,而不是在达到max_steps指定的步骤数时停止。
"""
trainer = SFTTrainer(model=original_model,args=training_arguments,#train_dataset=train_data,eval_dataset=eval_data,peft_config=peft_config,# 模型配置文件dataset_text_field="text",tokenizer=tokenizer,max_seq_length=1024,packing=False,dataset_kwargs={"add_special_tokens": False,"append_concat_token": False,}
)"""
#可选
trainer = transformers.Trainer(model=peft_model,train_dataset=train_data,eval_dataset=eval_data,args=training_arguments,data_collator=transformers.DataCollatorForLanguageModeling(tokenizer, mlm=False),
)
"""

output_dir ( str) – 将写入模型预测和检查点的输出目录。

overwrite_output_dir(bool,可选,默认为False) – 如果为True,则覆盖输出目录的内容。如果output_dir指向检查点目录,请使用它继续训练 。

do_train ( bool,可选, 默认为False) – 是否运行训练。

do_eval ( bool,可选, 默认为False) – 是否在开发集上运行评估。

do_predict ( bool,可选, 默认为False) – 是否在测试集上运行预测。

evaluate_during_training (bool,可选,默认为False) – 是否在每个记录步骤的训练期间运行评估。

per_device_train_batch_size ( int,可选,默认为 8)– 用于训练的每个 GPU/TPU 核心/CPU 的批量大小。

per_device_eval_batch_size(int,可选,默认为 8) – 用于评估的每个 GPU/TPU 核心/CPU 的批处理大小。

gradient_accumulation_steps – (int,可选,默认为 1):在执行向后/更新传递之前累积梯度的更新步骤数。

Learning_rate ( float,可选,默认为 5e-5) – Adam 的初始学习率。

Weight_decay ( float,可选,默认为 0) – 要应用的权重衰减(如果不为零)。

adam_epsilon ( float,可选,默认为 1e-8) – Adam 优化器的 Epsilon。

max_grad_norm ( float,可选,默认为 1.0) – 最大梯度范数(用于梯度裁剪)。

num_train_epochs ( float,可选,默认为 3.0) – 要执行的训练周期总数。

max_steps ( int,可选,默认为 -1) – 如果设置为正数,则为要执行的训练步骤总数。覆盖 num_train_epochs.

Warmup_steps ( int,可选,默认为 0) – 用于线性预热的步数,从 0 到learning_rate。

logging_dir ( str,可选) – Tensorboard 日志目录。默认为运行/CURRENT_DATETIME_HOSTNAME。

logging_first_step ( bool,可选, 默认为False) – 是否记录并评估第一个global_step。

logging_steps ( int,可选,默认为 500) – 两个日志之间的更新步骤数。

save_steps ( int,可选,默认为 500) – 两次检查点保存之前的更新步骤数。

save_total_limit ( int,可选) – 如果传递一个值,将限制检查点的总数。删除 中较旧的检查点 output_dir。

no_cuda(bool,可选,默认为False) – 是否不使用 CUDA,即使它可用或不可用。

seed(int,可选,默认为 42) – 用于初始化的随机种子。

fp16(bool,可选,默认为False) – 是否使用 16 位(混合)精度训练(通过 NVIDIA apex)而不是 32 位训练。

fp16_opt_level(str,可选,默认为 'O1') – 对于fp16训练,在 [‘O0’、‘O1’、‘O2’ 和 ‘O3’] 中选择顶点 AMP 优化级别。请参阅apex 文档的详细信息。

local_rank ( int,可选, 默认为 -1)– 在分布式训练期间,进程的排名。

tpu_num_cores ( int,可选) – 在 TPU 上训练时,TPU 核心的数量(由启动器脚本自动传递)。

debug ( bool,可选,默认为False) – 在 TPU 上训练时,是否打印调试指标。

dataloader_drop_last ( bool,可选, 默认为False) – 是否删除最后一个不完整的批次(如果数据集的长度不能被批次大小整除)。

eval_steps ( int,可选,默认为 1000) – 两次评估之间的更新步骤数。

past_index ( int,可选,默认为 -1) – TransformerXL或 :docXLNet <…/model_doc/xlnet> 等模型可以利用过去的隐藏状态进行预测。如果此参数设置为正整数,则将 Trainer使用相应的输出(通常为索引 2)作为过去状态,并在关键字参数下的下一个训练步骤中将其馈送到模型mems。

模型运行

trainer.train()
#模型保存
trainer.save_model()
#保存token
tokenizer.save_pretrained(output_dir)

在这里插入图片描述
效果不非常理想。测试集上基本没有下降。

人工测试

模型保存

import torch
from peft import AutoPeftModelForCausalLM
from transformers import AutoTokenizer,BitsAndBytesConfigdevice = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")#路径是输出的模型路径
finetuned_model = "F:\python_code\AIGC\Finetune\LLAMA_peft-dialogue-summary-training-1715510377\checkpoint-250"
compute_dtype = getattr(torch, "float16")
tokenizer = AutoTokenizer.from_pretrained(r"D:\临时模型\Meta-Llama-3-8B-Instruct")bnb_config = BitsAndBytesConfig(load_in_4bit=True,bnb_4bit_quant_type='nf4',bnb_4bit_compute_dtype=compute_dtype,bnb_4bit_use_double_quant=False,)model = AutoPeftModelForCausalLM.from_pretrained(finetuned_model,torch_dtype=compute_dtype,quantization_config=bnb_config,return_dict=False,low_cpu_mem_usage=True,device_map=device,
)merged_model = model.merge_and_unload()merged_model.save_pretrained("./merged_summary_model_3",safe_serialization=True, max_shard_size="2GB")
tokenizer.save_pretrained("./merged_summary_model_3")

比对测试

import torch
from transformers import AutoTokenizer, AutoModelForCausalLM,BitsAndBytesConfig
#from transformers import
import time
import pandas as pd
from datasets import Datasetcompute_dtype = getattr(torch, "float16")
bnb_config = BitsAndBytesConfig(load_in_4bit=True,bnb_4bit_quant_type='nf4',bnb_4bit_compute_dtype=compute_dtype,bnb_4bit_use_double_quant=False,)model_name=r'F:\python_code\AIGC\Finetune\merged_summary_model_3'
#model_name=r'D:\临时模型\Meta-Llama-3-8B-Instruct'device_map = {"": 0}
original_model = AutoModelForCausalLM.from_pretrained(model_name, device_map=device_map,quantization_config=bnb_config,trust_remote_code=True,use_auth_token=True)tokenizer = AutoTokenizer.from_pretrained(model_name,trust_remote_code=True,padding_side="left",add_eos_token=True,add_bos_token=True,use_fast=False)
tokenizer.pad_token = tokenizer.eos_tokendata_test_pth = '../Fine-tune/data/lcsts_test_set/{}'.format('test.csv')
data_test = pd.read_csv(data_test_pth)
data_test = Dataset.from_pandas(data_test)seed = 123def gen(model,p, maxlen=100, sample=True):toks = tokenizer(p, return_tensors="pt") #token转换#构建模型的对话摸索res = model.generate(**toks.to("cuda"), max_new_tokens=maxlen, do_sample=sample,num_return_sequences=1,temperature=0.1,num_beams=1,top_p=0.95,).to('cpu')return tokenizer.batch_decode(res,skip_special_tokens=True)from transformers import set_seed
seed = 42
set_seed(seed)index = 10prompt = data_test[index]['text1']
summary = data_test[index]['text2']#指导:总结以下对话。\n{prompt}\n输出:\n
formatted_prompt = f"总结以下对话.并使用中文回答\n{prompt}\n总结:\n"#输入模型 提示词 ,maxlen
res = gen(original_model,formatted_prompt,100,)#print(res[0])
output = res[0].split('\n')[3]
dash_line = '-'.join('' for x in range(100))#分割符
print(dash_line)
print(f'输入提示词:\n{formatted_prompt}')
print(dash_line)
print(f'目标值:\n{summary}\n')
print(dash_line)
print(f'模型输出:\n{output}')

PEFT结果

在这里插入图片描述

原始模型结果

在这里插入图片描述
感觉和没有训练过的模型输出基本一致。还是需要使用中文类型的模型进行fine tune。
以上是本文的全部内容。

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

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

相关文章

C++ vs Rust vs Go 性能比较

本文对C、Rust和Go三种编程语言编写的gunzip程序进行了性能比较&#xff0c;通过基准测试试图尽可能公平的比较它们的性能。原文: Performance — C vs Rust vs Go 本文将通过一些基准测试&#xff0c;比较 C 和 Rust 以及 Go 编写的相同程序的性能。我们将尽最大努力将语言差异…

Ubuntu20.04右键打不开终端

今天用virtualbox安装了ubuntu20.04 问题&#xff1a;右键打开终端&#xff0c;怎么也打开不了&#xff01; 点了也没反应&#xff0c;或者鼠标转小圈圈&#xff0c;然后也没有反应… 解决方法&#xff1a; 1、Ctrl Alt F6 先切换到终端访问界面 mac电脑 Ctrl Alt F6 …

计算机网络【应用层】邮件和DNS

文章目录 电子邮件DNSDNS提供的服务&#xff1a;域名分级域名解析流程DNS资源记录DNS服务器类型 电子邮件 使用SMTP协议发送邮件之前&#xff0c;需要将二进制多媒体数据编码为ASCII码SMTP一般不使用中间邮件服务器发送邮件&#xff0c;如果收件服务器没开机&#xff0c;那么会…

鸿蒙内核源码分析(消息封装篇) | 剖析LiteIpc(上)进程通讯内容

基本概念 LiteIPC是OpenHarmony LiteOS-A内核提供的一种新型IPC&#xff08;Inter-Process Communication&#xff0c;即进程间通信&#xff09;机制&#xff0c;为轻量级进程间通信组件&#xff0c;为面向服务的系统服务框架提供进程间通信能力&#xff0c;分为内核实现和用户…

测试人的福音:开源流量回放工具快速上手实践

笔者前段时间在参加测开大会时了解到了一款开源的自动化回归测试工具 AREX。主要是通过复制线上真实流量到测试环境进行回归测试&#xff0c;同时还做到了接口返回值的比对和写接口的验证&#xff0c;回放不会产生真实的数据或者调用&#xff0c;都是基于 Mock 数据的&#xff…

5分钟学设计模式:简单工厂与美食街的不期而遇

大家好&#xff0c;我是知微。 写代码好几年&#xff0c;是不是还纠结于这些问题&#xff1a; 面对一堆if-else&#xff0c;代码越写越长&#xff0c;维护起来比攀登珠穆朗玛峰还难每次只敢小心翼翼改个小功能&#xff0c;生怕程序突然“嘭”一声&#xff0c;全炸了想学习大佬…

18.Docker学习

1.Docker应用场景 Docker借鉴了标准集装箱的概念。标准集装箱将货物运往世界各地&#xff0c;Docker&#xff08;模板&#xff09;将软件运往各个环境&#xff08;测试环境和生产环境拉取镜像&#xff08;实例&#xff09;&#xff09;&#xff0c;相当于是一个模子刻出来的 …

计算机毕业设计springboot+vue高校教师职称评审评定系统605z3

技术栈 前端&#xff1a;vue.jsElementUI 开发工具&#xff1a;IDEA 或者eclipse都支持 编程语言: java 框架&#xff1a; ssm/springboot 数据库: mysql 版本不限 数据库工具&#xff1a;Navicat/SQLyog都可以 详细技术&#xff1a;javaspringbootvueMYSQLMAVEN 本系统采用in…

Google Pixel4手机刷机+Root+逆向环境详细教程

Google Pixel4手机刷机Root逆向环境配置详细教程 刷机工具下载 Windows10、Google Pixel4手机当前安卓10系统、adb工具、要刷的谷歌原生的Android11最新刷机包、安装google usb驱动、美版临时twrp-3.6.0_11-0-flame.img和美版永久twrp-installer-3.6.0_11-0-flame.zip、Magis…

如何使用Shortemall自动扫描URL短链接中的隐藏内容

关于Shortemall Shortemall是一款针对URL地址安全与Web内容安全的强大工具&#xff0c;该工具基于纯Python开发&#xff0c;专为Web安全方向设计&#xff0c;可以帮助广大研究人员以自动化的形式扫描URL短链接中的隐藏内容。 Shortemall的全名为ShortEm All&#xff0c;该工具…

乡村振兴与乡村旅游深度融合:依托乡村自然和文化资源,发展乡村旅游产业,促进农民增收致富,打造特色美丽乡村

目录 一、引言 二、乡村振兴与乡村旅游的内在联系 三、依托乡村自然和文化资源发展乡村旅游产业 &#xff08;一&#xff09;挖掘乡村自然资源优势&#xff0c;打造特色旅游品牌 &#xff08;二&#xff09;挖掘乡村文化资源内涵&#xff0c;丰富旅游活动内容 四、促进农…

IP SSL怎么签发使用

IP证书的签发首先是需要有一个可供绑定的IP地址&#xff0c;作为常用数字证书之一&#xff0c;IP证书也因为其广泛的应用范围而深得用户的青睐和喜欢。 部署IP证书后&#xff0c;可以实现该IP地址的https访问&#xff0c;过程和域名证书相差不多。 IP证书和域名证书的区别 很…

接收区块链的CCF会议--NDSS 2025 截止7.10 附录用率

会议名称&#xff1a;Network and Distributed System Security Symposium (NDSS) CCF等级&#xff1a;CCF A类学术会议 类别&#xff1a;网络与信息安全 录用率&#xff1a;2024年接收率19.5% Submissions are solicited in, but not limited to, the following areas: Ant…

《系统管理学报》期刊投稿经验与流程分享(一轮退修,历时3月)

双非研二&#xff0c;三作&#xff08;导师一作&#xff0c;师哥二作&#xff09;&#xff0c;《系统管理学报》期刊录用 投稿网址&#xff1a;https://xtglxb.sjtu.edu.cn/journalx_jgxb/authorLogOn.action 投稿&收稿&#xff1a;2022年12月26日初审&#xff1a;2023年…

强大的开源项目RAG-GPT:5分钟实现LLM大模型应用到你的网站!

强大的开源项目RAG-GPT&#xff1a;5分钟实现LLM大模型应用到你的网站&#xff01; 引言 随着chatgpt等大型语言模型&#xff08;LLM&#xff09;能力越来越强大&#xff0c;如何将这些模型精准地应用于特定垂直领域&#xff0c;让各行业开发者快速利用LLM赋能也成为热点和痛…

WS2811 单线 256 级灰度三通道恒流 LED 驱动器芯片 IC

产品概述 WS2811 是三通道LED驱动控制专用电路&#xff0c;芯片内部包含了智能数字接口数据锁存信号整形放大驱动电路&#xff0c;还包含有高精度的内部振荡器和15V高压可编程定电流输出驱动器。同时&#xff0c;为了降低电源纹波&#xff0c;3个通道有一定的延时导通功…

4.1 文本相似度(二)

目录 1 文本相似度评估 2 代码 2.1 load_dataset 方法 2.2 AutoTokenizer、AutoModelForSequenceClassification 1 文本相似度评估 对两个文本拼接起来&#xff0c;然后作为一个样本喂给模型&#xff0c;作为一个二分类的任务&#xff1b; 数据处理的方式以及训练的基本流程…

2024最新版JavaScript逆向爬虫教程-------基础篇之无限debugger的原理与绕过

目录 一、无限debugger的原理与绕过1.1 案例介绍1.2 实现原理1.3 绕过debugger方法1.3.1 禁用所有断点1.3.2 禁用局部断点1.3.3 替换文件1.3.4 函数置空与hook 二、补充2.1 改写JavaScript文件2.2 浏览器开发者工具中出现的VM开头的JS文件是什么&#xff1f; 三、实战 一、无限…

一篇文章掌握所有国债期货的基本交易策略介绍

国债期货是一种基本的利率衍生品&#xff0c;根据交易者交易目的不同&#xff0c;可以将期货交易行为分为三类&#xff1a;套期保值、套利交易和投机交易。套期保值是投资者为了避免现有或将来预期的投资组合价值受市场利率变动的影响&#xff0c;而在国债期货市场上采取抵消性…

2023年30米分辨率土地利用遥感监测数据

改革开放以来&#xff0c;中国经济的快速发展对土地利用模式产生了深刻的影响。同时&#xff0c;中国又具有复杂的自然环境背景和广阔的陆地面积&#xff0c;其土地利用变化不仅对国家发展&#xff0c;也对全球环境变化产生了深刻的影响。为了恢复和重建我国土地利用变化的现代…