使用OneFlow搭建神经网络
使用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.nn、oneflow.math、oneflow.layers 等模块。
使用OneFlow搭建神经网络的更多相关文章
- (转)一文学会用 Tensorflow 搭建神经网络
一文学会用 Tensorflow 搭建神经网络 本文转自:http://www.jianshu.com/p/e112012a4b2d 字数2259 阅读3168 评论8 喜欢11 cs224d-Day ...
- 用Tensorflow搭建神经网络的一般步骤
用Tensorflow搭建神经网络的一般步骤如下: ① 导入模块 ② 创建模型变量和占位符 ③ 建立模型 ④ 定义loss函数 ⑤ 定义优化器(optimizer), 使 loss 达到最小 ⑥ 引入 ...
- Tensorflow 搭建神经网络及tensorboard可视化
1. session对话控制 matrix1 = tf.constant([[3,3]]) matrix2 = tf.constant([[2],[2]]) product = tf.matmul(m ...
- 一文学会用 Tensorflow 搭建神经网络
http://www.jianshu.com/p/e112012a4b2d 本文是学习这个视频课程系列的笔记,课程链接是 youtube 上的,讲的很好,浅显易懂,入门首选, 而且在github有代码 ...
- TensorFlow笔记-05-反向传播,搭建神经网络的八股
TensorFlow笔记-05-反向传播,搭建神经网络的八股 反向传播 反向传播: 训练模型参数,在所有参数上用梯度下降,使用神经网络模型在训练数据上的损失函数最小 损失函数:(loss) 计算得到的 ...
- 用Keras搭建神经网络 简单模版(二)——Classifier分类(手写数字识别)
# -*- coding: utf-8 -*- import numpy as np np.random.seed(1337) #for reproducibility再现性 from keras.d ...
- Tensorflow学习:(二)搭建神经网络
一.神经网络的实现过程 1.准备数据集,提取特征,作为输入喂给神经网络 2.搭建神经网络结构,从输入到输出 3.大量特征数据喂给 NN,迭代优化 NN 参数 4.使 ...
- 用Keras搭建神经网络 简单模版(六)——Autoencoder 自编码
import numpy as np np.random.seed(1337) from keras.datasets import mnist from keras.models import Mo ...
- 【pytorch】学习笔记(四)-搭建神经网络进行关系拟合
[pytorch学习笔记]-搭建神经网络进行关系拟合 学习自莫烦python 目标 1.创建一些围绕y=x^2+噪声这个函数的散点 2.用神经网络模型来建立一个可以代表他们关系的线条 建立数据集 im ...
随机推荐
- php自定义配置文件简单写法
1 <?php 2 header("Content-type:text/html;charset=utf-8"); 3 4 $q = getconfig('rr'); 5 e ...
- 解决小程序中Data.parse()获取时间戳IOS不兼容
由于与后台接口必须对比时间戳所以首先得前台获取时间戳.刚开始是获取手机本地时间,但用户改了时间就废了..... 后来就从服务器上获取个时间再转换为时间戳(是不是很操蛋,先从服务器上获取在TM的自己比较 ...
- hdu 4309 最大流 + DFS
题意: 给以三种有向边 (1) 隧道,可以过无数人,也可以藏c个人. (2) 路,只能过人(流量INF). (3)古桥,如果不修理可以过1个人,修理可以过无数个人,但 ...
- C#-获取磁盘,cpu,内存信息
获取磁盘信息 zongdaxiao = GetHardDiskSpace("C") * 1.0 / 1024; user = GetHardDiskFreeSpace(" ...
- .NET之默认依赖注入
介绍 不要依赖于具体的实现,应该依赖于抽象,高层模块不应该依赖于底层模块,二者应该依赖于抽象.简单的说就是为了更好的解耦.而控制反转(Ioc)就是这样的原则的其中一个实现思路, 这个思路的其中一种实现 ...
- springboot项目部署(war包)
将springboot项目打包成war,并且部署到tomcat.比较麻烦,自己踩的坑也比较多.算了一下,找bug的时间,有两天熬到凌晨2点. 修改pom.xml使得打包成war <groupId ...
- 手把手教你掌握——性能工具Jmeter之参数化(含安装教程 )
本节大纲 Jmeter 发送get/post请求 Jmeter 之文件参数化-TXT/Csv Jmeter之文件参数化-断言 JMeter简介 Apache JMeter是一款基于JAVA的压力测试T ...
- 接口测试原理及Postman详解
接口测试定义 接口是前后端沟通的桥梁,是数据传输的通道,包括外部接口.内部接口.内部接口又包括:上层服务与下层服务接口,同级接口 生活中常见接口:电脑上的键盘.USB接口,电梯按钮,KFC下单 接口测 ...
- HDU - 3347 Calculate the expression — 模拟 + map存变量
传送门 题意:从输入开始,1.输入样例数:2.然后输入一组样例中的行数n:3.前n-1行为定义变量(之间使用空格隔开),只需要map存进去就可以了(这里有覆盖的情况,故使用mp["s&quo ...
- 【Web前端HTML5&CSS3】03-字符实体与语义标签
笔记来源:尚硅谷Web前端HTML5&CSS3初学者零基础入门全套完整版 目录 字符实体与语义标签 1. 字符实体 2. meta标签 3. 语义标签 4. 块元素与行内元素 块元素(bloc ...