使用OneFlow搭建神经网络

在 识别 MNIST 手写体数字 的例子中,通过 flow.layers 和 flow.nn 中提供的接口搭建了一个简单的 LeNet 网络。下面,将通过LeNet来介绍 Onflow 中网络搭建的核心元素—算子(op)和层(layer)。

LeNet 是一个主要由卷积层、池化层和全连接层组成的神经网络。

上图中有两类元素,一类是方框代表的运算单元,包括 op 和 layer 两类,比如 conv2d 、 dense 、 max_pool2d 等;一类是箭头代表的数据。对应了以下代码:

def lenet(data, train=False):

initializer = flow.truncated_normal(0.1)

conv1 = flow.layers.conv2d(

data,

32,

5,

padding="SAME",

activation=flow.nn.relu,

name="conv1",

kernel_initializer=initializer,

)

pool1 = flow.nn.max_pool2d(

conv1, ksize=2, strides=2, padding="SAME", name="pool1", data_format="NCHW"

)

conv2 = flow.layers.conv2d(

pool1,

64,

5,

padding="SAME",

activation=flow.nn.relu,

name="conv2",

kernel_initializer=initializer,

)

pool2 = flow.nn.max_pool2d(

conv2, ksize=2, strides=2, padding="SAME", name="pool2", data_format="NCHW"

)

reshape = flow.reshape(pool2, [pool2.shape[0], -1])

hidden = flow.layers.dense(

reshape,

512,

activation=flow.nn.relu,

kernel_initializer=initializer,

name="dense1",

)

if train:

hidden = flow.nn.dropout(hidden, rate=0.5, name="dropout")

return flow.layers.dense(hidden, 10, kernel_initializer=initializer, name="dense2")

作业函数运行时,data 是形状为 100x1×28×28 的数据,data 首先作为 conv2d 的输入参与卷积计算,得到计算结果conv1 ,然后 conv1 作为输入传给 max_pool2d ,依此类推。

op 和 layer

算子(Op)是比较常用的一种概念,是 OneFlow 中基本的运算单元,上文代码中的 reshape 和 nn.max_pool2d 就是两种算子。

layers.conv2d 和 layers.dense 不是基本的运算单元,由算子组合成的特定的运算层(layer)。层的存在使得搭建神经网络更方便,相关接口使用请参考 oneflow.layers API

通过阅读 oneflow.layers 源码 ,可以学习由基本算子构建运算层的细节。

网络构建过程中的数据块

OneFlow 默认模式是静态图机制,网络的构建和运行过程其实是分开的。因此,在定义网络时,各个变量中 并没有 真实的数据,只是数据的占位符。对于真实数据的计算发生在作业函数的调用过程中。

在构建网络时,只是描述了网络中各个节点的性质、形状(如 shape、dtype)与连接关系等,这些节点中没有具体的数值,仅仅只是 数据占位符, OneFlow 可以根据这种数据占位符进行编译推理,得到计算图。

这种数据占位符在 OneFlow 的语境中被称作 Blob ,在 OneFlow 中有对应的基类 BlobDef。

搭建网络时可以打印 Blob 的属性,比如以下代码打印 conv1 的 shape 和 dtype :

print(conv1.shape, conv1.dtype)

Blob 的运算符重载 BlobDef 中定义了运算符重载,也就是说,BlobDef 对象之间可以进行加减乘除等操作。

例如下面这句代码中的加号:

output = output + fc2_biases

这句代码等价于:

output = flow.broadcast_add(output, fc2_biases)

总结

使用 OneFlow 进行神经网络搭建,需要 OneFlow 提供的算子或层作为计算单元。数据占位符 Blob 作为算子和层的输入和输出,运算符重载帮助简化了部分语句。

OneFlow 提供的算子可以参阅 API 文档中的:oneflow.nnoneflow.mathoneflow.layers 等模块。

使用OneFlow搭建神经网络的更多相关文章

  1. (转)一文学会用 Tensorflow 搭建神经网络

    一文学会用 Tensorflow 搭建神经网络 本文转自:http://www.jianshu.com/p/e112012a4b2d 字数2259 阅读3168 评论8 喜欢11 cs224d-Day ...

  2. 用Tensorflow搭建神经网络的一般步骤

    用Tensorflow搭建神经网络的一般步骤如下: ① 导入模块 ② 创建模型变量和占位符 ③ 建立模型 ④ 定义loss函数 ⑤ 定义优化器(optimizer), 使 loss 达到最小 ⑥ 引入 ...

  3. Tensorflow 搭建神经网络及tensorboard可视化

    1. session对话控制 matrix1 = tf.constant([[3,3]]) matrix2 = tf.constant([[2],[2]]) product = tf.matmul(m ...

  4. 一文学会用 Tensorflow 搭建神经网络

    http://www.jianshu.com/p/e112012a4b2d 本文是学习这个视频课程系列的笔记,课程链接是 youtube 上的,讲的很好,浅显易懂,入门首选, 而且在github有代码 ...

  5. TensorFlow笔记-05-反向传播,搭建神经网络的八股

    TensorFlow笔记-05-反向传播,搭建神经网络的八股 反向传播 反向传播: 训练模型参数,在所有参数上用梯度下降,使用神经网络模型在训练数据上的损失函数最小 损失函数:(loss) 计算得到的 ...

  6. 用Keras搭建神经网络 简单模版(二)——Classifier分类(手写数字识别)

    # -*- coding: utf-8 -*- import numpy as np np.random.seed(1337) #for reproducibility再现性 from keras.d ...

  7. Tensorflow学习:(二)搭建神经网络

    一.神经网络的实现过程 1.准备数据集,提取特征,作为输入喂给神经网络       2.搭建神经网络结构,从输入到输出       3.大量特征数据喂给 NN,迭代优化 NN 参数       4.使 ...

  8. 用Keras搭建神经网络 简单模版(六)——Autoencoder 自编码

    import numpy as np np.random.seed(1337) from keras.datasets import mnist from keras.models import Mo ...

  9. 【pytorch】学习笔记(四)-搭建神经网络进行关系拟合

    [pytorch学习笔记]-搭建神经网络进行关系拟合 学习自莫烦python 目标 1.创建一些围绕y=x^2+噪声这个函数的散点 2.用神经网络模型来建立一个可以代表他们关系的线条 建立数据集 im ...

随机推荐

  1. 《IDA Pro 代码破解解密》笔记一

    博客地址:http://blog.csdn.net/qq1084283172/article/details/53158970 return 0;  C语言返回0语句的汇编形式 Intel-32汇编: ...

  2. VRRP中的上层回的路由

    如图,PC1和PC2处于不同网段,他们到AR3都有两条路可以选,现在要让他们到达AR3负载均衡,并且当AR1和 AR2的其中一个路由器挂了之后,他们仍然可以正常到达AR3. 他们去往AR3的VRRP的 ...

  3. 15.PHP_PHP与Ajax

    PHP与Ajax 刚刚下班回来地铁上看的这一章,觉得这东西思路可以.确实解决了WEB的两个大的问题,流量和计算量问题.简单说下我的理解,然后在根据资料整理下学习笔记. 两个问题: 1.展示一个WEB网 ...

  4. 前端小白的学习之路html与css的较量【二】

    标签的划分 块级元素 独占一行 设置 宽 高可以起作用 排列方式: 上下排列 行内元素 可以共占一行 设置 宽 高 不起作用,大小由内容决定 排列方式:左右排列 行内块 可以共占一行 可以设置宽 高 ...

  5. Day003 彻底搞懂++、--

    彻底搞懂++.-- ++.--都是一目运算符 b=a++(把a的值先赋给b,a再自增1) b=++a(a先自增1,再赋给b) 通过一个例子理解 int a=1; int b=a++; int c=++ ...

  6. FreeBSD系统基本操作

    1:系统安装 2:关机与重启命令 立即关机,但是不关闭电源: shutdown -h now 立即关机,并且关闭电源: shutdown -p now 重启命令 shutdown -r now

  7. linux集群压测部署方案

    我们今天主要分享的内容从三方面讲解. 集群压力机部署 shell脚本简介 shell脚本搞定压力机部署 集群压力机部署   linux.png 分布式压测背景介绍 在企业项目实战时,如果被压的服务器处 ...

  8. Hive解析Json数组超全讲解

    在Hive中会有很多数据是用Json格式来存储的,如开发人员对APP上的页面进行埋点时,会将多个字段存放在一个json数组中,因此数据平台调用数据时,要对埋点数据进行解析.接下来就聊聊Hive中是如何 ...

  9. VS中光标变成方块状,输入时会把光标覆盖的部分替换掉的解决方法

    按下键盘上的Insert键,切换为插入模式.

  10. 一文弄懂pytorch搭建网络流程+多分类评价指标

    讲在前面,本来想通过一个简单的多层感知机实验一下不同的优化方法的,结果写着写着就先研究起评价指标来了,之前也写过一篇:https://www.cnblogs.com/xiximayou/p/13700 ...