分类
外匯交易策略

NN模型在金融风控场景中的应用

torch.nn.functional.mse_loss¶

To analyze traffic and optimize your experience, we serve cookies on this site. By clicking or navigating, you agree to allow our usage NN模型在金融风控场景中的应用 of cookies. As the current maintainers of this site, Facebook’s Cookies Policy applies. Learn more, including NN模型在金融风控场景中的应用 about available controls: Cookies Policy.

pytorch教程之nn.Module类详解——使用Module类来自定义模型

LoveMIss-Y 于 2019-05-30 20:35:40 发布 75361 收藏 1424

前言:pytorch中对于一般的序列模型,直接使用torch.nn.Sequential类及可以实现,这点类似于keras,但是更多的时候面对复杂的模型,比如:多输入多输出、多分支模型、跨层连接模型、带有自定义层的模型等,就需要自己来定义一个模型了。本文将详细说明如何让使用Mudule类来自定义一个模型。

一、torch.nn.Module类概述

(2)pytorch中其实一般没有特别明显的Layer和Module的区别,不管是 自定义层、自定义块、自定义模型,都是通过继承Module类完成的 ,这一点很重要。其实Sequential类也是继承自Module类的。

注意: 我们当然也可以直接通过继承torch.autograd.Function类来自定义一个层,但是这很不推荐,不提倡,至于为什么后面会介绍。

总结:pytorch里面一切自定义操作基本上都是继承nn.Module类来实现的

二、torch.nn.Module类的简介 NN模型在金融风控场景中的应用

我们在定义自已的网络的时候,需要继承nn.Module类,并 重新实现构造函数__init__构造函数和forward这两个方法 。但有一些注意技巧:

(1)一般把网络中具有 可学习参数的层(如全连接层、卷积层等) 放在构造函数__init__()中,当然我也可以吧不具有参数的层也放在里面;

(2)一般把 不具有可学习参数的层(如ReLU、dropout、BatchNormanation层) 可放在构造函数中,也可不放在构造函数中,如果不放在构造函数__init__里面,则在forward方法里面可以使用nn.NN模型在金融风控场景中的应用 functional来代替

注意:上面的是将所有的层都放在了构造函数__init__里面,但是只是定义了一系列的层,各个层之间到底是什么连接关系并没有,而是在forward里面实现所有层的连接关系,当然这里依然是顺序连接的。下面再来看一下一个例子:

总结: 所有放在构造函数__init__里面的层的都是这个模型的“固有属性” .

三、torch.nn.Module类的的多种实现

3.1 通过Sequential来包装层

(1)方式一:

(2)方式二:

(3)方式三:

3.2 Module类的几个常见方法使用

特别注意: Sequential类虽然继承自Module类,二者有相似部分,但是也有很多不同的部分,集中体现在:

Sequenrial类实现了整数索引,故而可以使用model[index] 这样的方式获取一个曾,但是Module类并没有实现整数索引,不能够通过整数索引来获得层 ,那该怎么办呢?它提供了几个主要的方法,如下:

(1)model.children()方法

(2)model.named_children()方法

总结:

(1)model.children()和model.named_children()方法 返回的是迭代器iterator

(2)model.children():每一次迭代返回的 每一个元素实际上是 Sequential 类型 ,而Sequential类型又可以使用下标index索引来获取每一个Sequenrial 里面的具体层,比如conv层、dense层等;

(3)model.named_children():每一次迭代返回的 每一个元素实际上是 一个元组类型 ,元组的第一个元素是名称,第二个元素就是对应的层或者是Sequential。

(3)model.modules()方法

(4)model.named_modules()方法

总结:

(1)model.modules()和model.named_modules()方法 返回的是迭代器iterator

(2)model的modules()方法和named_modules()方法都会将整个模型的所有构成(包括包装层、单独的层、自定义层等) 由浅入深依次遍历出来 ,只不过modules()返回的每一个元素是直接返回的层对象本身,而named_modules()返回的每一个元素是一个元组,第一个元素是名称,第二个元素才是层对象本身。

注意: 上面这四个方法是以层包装为例来说明的,如果没有层的包装,我们依然可以使用这四个方法,其实结果也是类似的这样去推,这里就不再列出来了。