基于pytorch的台风降水datasets类构建学习笔记

  1. dl模型花里胡哨一堆,但跑了这么多模型才发现特征工程的重要性,处理好气象数据对于结果还是非常重要的。
  2. 在处理气象时空序列问题常采用滑动窗口的方法来从时序数据中切出数据集。

基本的台风数据集构建

这也是我入门时接触的一种基于pytorch定制基于台风序列数据的datasets类。

下面方法来自追风比赛上的baseline模型

首先这个大佬的思路是把序列文件摊开,然后用步长为1的滑动窗口去切割序列,首先要面对如下三个问题。

1. 时间点丢失,即整个时间点的三个通道的数据全部丢失;
2. 通道丢失,某个时间点的一个或两个数据通道文件丢失;
3. 区域丢失,某时间点的三个数据通道文件都存在,但是数据本身存在不正常(大面积为0)。

他的方法处理缺少数据是使用上一个时间点去填充缺失点数据。

接着就是定制的datasets类:

    # 用于将加载的数据保存在内存中。因为每次要加载12张图像,会花费比较长的时间。self.allframes = [None] * len(self.files)tids = []for i in range(len(self.allframes)):self.allframes[i] = []tids.append(int(re.findall(r'Hour_(\d+)', self.files[i])[0]))def __len__(self):# 实际可遍历的时间点数要小于总时间点数,因为一次加载的时间跨度为42小时(用最后6小时的数据去预测未来36小时的情况)return len(self.files) - (self.fnum // 2) * (self.freq + 1) + 1def __getitem__(self, idx):# 列出12帧数据的时间点ID,比如 A_Hour_189 的时间点ID为189# 那要加载数据ID为 [189, 190, 191, 192, 193, 194, 200, 206, 212, 218, 224, 230]tid = self.tids[idx]ids1 = list(range(tid, tid + (self.fnum // 2)))ids2 = list(range(tid + (self.fnum // 2) + self.freq - 1, tid + (self.fnum // 2) + self.freq + (self.fnum // 2) * self.freq - 1, self.freq))ids = ids1 + ids2
return ids, frames_crop

上面就是定制datasets类,废话不多说直取核心,__init__部分加载摊开的序列数据文件名列表,__len__部分为去除最后不满足滑窗长度数据后的序列数据个数,__getitem__返回序列号和滑窗长度的数据格式为 scwh。

当然这种步长为1的滑窗会忽略掉不同时段的数据差异,并且会造成数据泄露?我的理解是target的值作为feature参与到了input的训练中,这里我理解不深,网上查阅后大概的意思就是在数据比赛中这是一种投机的技巧?在数据eda阶段,有的feature会与target高相关,所以作为feature是不合适的。

  • 接下来总结我关注的三个长期关于雷达回波外推的数据处理方法,一个是国防科技大一课题组从17年开始的各种主流dl模型在回波外推应用,另一个是清华一课题组从predrnn开始的工作,最后一个就是经典的施行建三个模型的数据处理。

  • 首先是国防科大课题组的处理


  • 这是他们17年的处理方法,还是比较朴素的。

    这是19年最新的方法,取滑窗长度25然后步长为3,去切每个雨天的数据,这个相比于把整个序列摊开去切不会出现input里有有个不同天的序列,然后就普通的操作clip到0-75dbz然后归一化。将数据集随机分成7:2:1训练测试和验证。

  • 下面关注清华课题组的从predrnn到e3dlstm的datasets处理方法,由于git上的三个模型里都没有找到关于气象数据处理的INputhandle,且他们的操作基于tensorflow较之torch相当于定制了datasets+dataloader比较麻烦,当初入门的时候一上来就干这个真是不堪回首,所以来参考这个:

  • 滑窗长度为20,步长为猜测估计为1-2,resize成100x100,这里有个问题预测图片太小在实际工作中不具有指导意义,下面总结高分辨率的两篇文章这个为800x800:

  • 他采用步长为1的滑窗去切割,而另一篇国家气象局的文章中采用了相对专业的滤波操作:

  • 而shi博士的滤波操作为采用几个月的数据进行k-mean然后滤去杂波。

接下来就是shi博士15-17年的几个经典模型的datasets操作,由于比较复杂我尝试去理解一下。hozzone在用pytorch复现其模型时直接用了类似于pytorch中datasets+dataloader的组合:

    train_hko_iter = HKOIterator(pd_path=cfg.HKO_PD.RAINY_TRAIN,sample_mode="random",seq_len=IN_LEN+OUT_LEN)

shi博士针对hko雷达数据定制了hkoiterator类,在训练中采用随机抽样,一个样本为滑窗长度(input+target)

for itera in tqdm(range(1, max_iterations+lr_scheduler.step()train_batch, train_mask, sample_datetimes, _ = \train_hko_iter.sample(batch_size=batch_size)

在抽样的时候调用了hkoiterator类的sample方法,简单清晰。

下面是hkoiterator类的说明文档:
“”"Random sample: sample a random clip that will not violate the max_missing frame_num criteria
Sequent sample: sample a clip from the beginning of the time.
Everytime, the clips from {T_begin, T_begin + 6min, …, T_begin + (seq_len-1) * 6min} will be used
The begin datetime will move forward by adding stride: T_begin += 6min * stride
Once the clips violates the maximum missing number criteria, the starting
point will be moved to the next datetime that does not violate the missing_frame criteria

它的模型类似于pytorch的dataload类中顺序取样和随机取样,在最原始的mxnet,hko-7项目中顺序取样的滑窗步长为5也就是input的长度,它保证了input部分的不重叠。如果它在取样的过程中出现超过阈值的缺测数据会跳到下个点开始。
这个操作由下面的方法来完成:

    def _next_exist_timestamp(self, timestamp):next_ind = bisect.bisect_right(self._df.index, timestamp)if next_ind >= self._df.size:return Noneelse:return self._df.index[bisect.bisect_right(self._df.index, timestamp)]

虽然没见过真实的hko-7数据,但基本能猜到什么样子。
下面的方法来判定是否超过最大缺测数:

    def _is_valid_clip(self, datetime_clip):"""Check if the given datetime_clip is valid
    def sample(self, batch_size, only_return_datetime=False):"""Sample a minibatch from the hko7 dataset based on the given type and pd_file

sample函数完成抽样,在顺序抽样模式下给入一个begin_timestep,而在随机抽样模式下直接随机给入起始点:

                    rand_ind = np.random.randint(0, self._df.size, 1)[0]random_datetime = self._df.index[rand_ind]

然后判断是否是一个有效的timestep,之后返回数据:

return frame_dat, mask_dat, datetime_clips, new_start

这上面的代码如今来看不是很复杂,但在本人入门连python都不会的时候直接就上手这个现在想想真是惨不忍睹,这说明了指导是非常重要的不然那叫一个撕心裂肺的难啊。

接下来尝试分析一下一个台湾老哥的台风降水预测,他采用了flow-gru和muli-handattention模块的convgru以及改造后的transformer模型,模型部分不是很复杂而看看他是怎么处理定制的datasets类的,我尽力猜猜看

  • 插入一个针对convlstm模糊问题改进的vae-lstm模型小总结
  • 这个作者认为convlstm到后期变模糊的原因是因为hidden之间的距离太大导致,优化的时候可选范围过大,在拟合真实的概率分布的时候范围过大不易拟合,其加入vae的思想将hidden从正态分布中抽样:
  • 他的思路是构建一个vae的encoder和一个decoder以及一个基于lstm的encoder+decoder:
  • 然后用了resnet残差的思想,走远了。来看台湾老哥的操作.
  • 这两个工作都对2017年天池cikm的数据集进行了预测,但这个vae老哥的效果并不是很好对convlstm的效果改进非常有限。
  • 首先台湾老哥对typhoon_list建立可操作的序列文件夹
  • ty_track_path = os.path.join(args.weather_raw_data_folder, year+'.Data', year+'_TrackData', year+'.'+tyname+'.Track.txt')
  • 老哥往txt里写dataframe这个操作没看懂,然后我猜整个操作时重新把序列按照雷达回波或者其他什么的数据按照时间步长一一对应返回索引csv
  • new_ty_track.to_csv(outputname)
  • 然后这个老哥把其他变量融合了一下,我是根据这个猜的:
_ = check_data_and_create_miss_data()
data1 = pd.read_pickle(os.path.join(args.radar_wrangled_data_folder, 'RAD', '2012.SAOLA.201208021530.pkl'),compression=args.compression)
data2 = pd.read_pickle(os.path.join(args.radar_wrangled_data_folder, 'RAD', '2012.SAOLA.201208021620.pkl'),compression=args.compression)
  • 继续猜,他对缺测的雷达回波数据线性内插,然后做了些qpe和rad的eda,所以qpe是什么鬼东西没看懂。
  • testdataset = TyDataset(args=args, train=False, train_num=train_num, transform=transform)
    在train文件中锁定目标 Tydataset定制类,看看老哥又是如何操作的呢
'''Args:train(boolean): Return training dataset or validating dataset.args(easydict): An edict for saving transform (callable, optional): Optional transform to be applied on a sample.'''

锁定类的文档,接受之前的typhoon_list

            ty_list = pd.read_csv(args.ty_list, index_col='En name').drop('Ch name', axis=1).iloc[:-2]ty_list['Time of issuing'] = pd.to_datetime(ty_list['Time of issuing'])ty_list['Time of canceling'] = pd.to_datetime(ty_list['Time of canceling'])ty_list.index.name = 'Typhoon'

定义类属性,input的size(400,400):

self.I_x = args.I_xself.I_y = args.I_yself.I_shape = args.I_shapeself.F_x = args.F_xself.F_y = args.F_y

不想看了,开始随便猜,下面这个是随机选一个台风事件作为data序列进行训练

  • 然后用了个骚操作应该是在dataframe上直接操作返回了滑动窗口组成的序列pkl文件,input长6target18,滑窗长24,骚操作如下三行:

  •          events_windows = ((frame_e-frame_s).apply(lambda x:x.days)*24*6 + (frame_e-frame_s).apply(lambda x:x.seconds)/600 + 1).astype(int)last_idx = np.cumsum(events_windows) - 1frist_idx = np.cumsum(events_windows) - events_windows
    
  • 简单的跑了下他的骚操作

  • 2个台风过程切出来了500个左右的序列样本。

  • 有意思的是它的雷达数据是存在pkl中的:

  • input_data[j,c,:,:] = pd.read_pickle(data_path, compression=self.compression).loc[self.I_y[0]:self.I_y[1], self.I_x[0]:self.I_x[1]].to_numpy()

  • 之后就用到了先前处理过的txt文件,跟一个归一化操作:

  • height = (height-np.min(height))/(np.max(height)-np.min(height))

  • return 一个字典:

  • self.sample = {'inputs': dBZ_to_pixel(input_data), 'targets': dBZ_to_pixel(target_data), 'ty_infos': ty_infos, 'height': height}

就记录这么多吧,有时间在补充补充

使用DL模型预测台风/雷达回波/降水的datasets构建学习笔记相关推荐

  1. 机器学习【西瓜书/南瓜书】--- 第2章模型评估与选择(上)(学习笔记+公式推导)

    目录 前言 2.1 经验误差与过拟合 2.2 评估方法 2.2.1 留出法(hode−outhode-outhode−out) 2.2.2 交叉验证法(crossvalidationcross val ...

  2. 带时滞的病毒模型计算模板【基于matlab的动力学模型学习笔记_1】

    /*仅当作学习笔记,若有纰漏欢迎友好交流指正,此外若能提供一点帮助将会十分荣幸*/ 摘 要:无论是生物病毒还是网络病毒,其内核的传播机理都有很多的相似之处.因此,本文在经典的SIR病毒模型基础上改造出 ...

  3. ICCV2013: 亲属关系预测 Facial Expression Dynamics for Kinship Verification 学习笔记

    Dance with Flow: Two-in-One Stream Action Detection 学习时,别忘了总是要问自己一个为什么 论文 文章: Like Father, Like Son: ...

  4. 项目实例:KNN预测电影网站用户性别(Hadoop学习笔记三)

    通过学习<Hadoop大数据开发基础>这本书,整理了一下书本上的项目案例.让自己再梳理一下流程,也希望能给有需要的人提供一定的帮助,写的不好的希望大家提出来,一起进步. 1 学习目标 理解 ...

  5. 2020-4-20 深度学习笔记20 - 深度生成模型 3 (实值数据上的玻尔兹曼机)

    第二十章 深度生成模型 Deep Generative Models 中文 英文 2020-4-17 深度学习笔记20 - 深度生成模型 1 (玻尔兹曼机,受限玻尔兹曼机RBM) 2020-4-18 ...

  6. 2020-4-22 深度学习笔记20 - 深度生成模型 5 (有向生成网络--sigmoid信念网络/可微生成器网络/变分自编码器VAE/生产对抗网络GAN/生成矩匹配网络)

    第二十章 深度生成模型 Deep Generative Models 中文 英文 2020-4-17 深度学习笔记20 - 深度生成模型 1 (玻尔兹曼机,受限玻尔兹曼机RBM) 2020-4-18 ...

  7. AI技术在气象领域应用方法:GFS数值模式的风速预报订正、台风预报数据智能订正、机器学习预测风电场的风功率、深度学习预测浅水方程模式、LSTM方法预测ENSO、深度学习convLSTM

    查看原文>>>Python人工智能在气象中的应用 Python是功能强大.免费.开源,实现面向对象的编程语言,在数据处理.科学计算.数学建模.数据挖掘和数据可视化方面具备优异的性能, ...

  8. 如何从零开始设计与开发一款通用模型预测调度系统 | 干货分享

    机器学习模型从训练导出到生成环境部署,这个过程中涉及大量工作,会面临着各种问题与挑战,比如不断丰富的业务场景,系统需要负载种类繁多的神经网络,预测任务不均匀等,然而企业拥有的计算资源(如GPU个数)是 ...

  9. ML/DL之预测分析类:利用机器学习算法进行预测分析的简介、分析、代码实现之详细攻略

    ML/DL之预测分析类:利用机器学习算法进行预测分析的简介.分析.代码实现之详细攻略 目录 机器学习算法进行预测的简介 机器学习算法进行预测的分析 机器学习算法进行预测的代码实现 机器学习算法进行预测 ...

最新文章

  1. 链接静态库时__imp_前缀错误
  2. AI帮你写Python,安装只需5步,还能任你调教 | 开源
  3. [转]基于Prototype,利用Canvas绘图实现的web流程图设计器(原型)
  4. CentOS 修改线程数限制等(limits.conf)
  5. ARM的位置无关程序设计
  6. 【2017年第4期】专题:大数据标准
  7. java小程序显示多种按钮_微信小程序 多行文本显示...+显示更多按钮和收起更多按钮功能...
  8. 让敏捷交付优秀的软件
  9. 程序人生001--点滴感悟-随笔01
  10. 对输入法的人机交互设计评价
  11. 大学计算机基础vfp程序设计课程试验报告簿,VF程序设计实验报告册(实践教程).doc...
  12. 齿轮仿真软件ROMAX DESIGNER安装教程
  13. gimp 抠图_GMIC(gimp 快速抠图)V1.5.2.4 免费版
  14. 如果细节决定成败,那么什么决定细节
  15. 朋友圈为什么不做智能排序?
  16. 多链钱包鼻祖bitpay 10.0.1最新版官方版下载和使用方法
  17. Webpack前端资源加载/打包工具
  18. 无线条形码刷枪工作频率问题
  19. 从键盘中读入最多不超过50个学生的学生信息(包括空格隔开的姓名、学号、年龄信息,以学号从低到高排序)
  20. ubu下编译安装php7

热门文章

  1. java8新特性-Stream入门学习
  2. IATF16949认证-汽车零部件行业的准入门槛
  3. Linux 下的usb无线网卡使用(arrch64和x64的同时踩坑)
  4. 【硬盘】希捷、西部数据最新20TB机械硬盘性能参数
  5. 机器人开发--扫地机器人系统的解决方案
  6. 服装设计网页制作_CLO Standalone(三维服装设计软件)下载-CLO Standalone(三维服装设计软件)免费版下载v6.0.328...
  7. 生物技术公司 Belite Bio纳斯达克上市:市值2.55亿美元
  8. 三种查看iPhone和iPad的UDID的简单方法
  9. 海康威视实习面试记录
  10. 计算机的大小端存储模式(计算机小白必看!)