『TensorFlow』网络操作API_上

『TensorFlow』网络操作API_中

『TensorFlow』网络操作API_下

之前也说过,tf 和 t 的层本质区别就是 tf 的是层函数,调用即可,t 的是类,需要初始化后再调用实例(实例都是callable的)

卷积

tensorflow.nn.conv2d

import tensorflow as tf

sess = tf.Session()
input = tf.Variable(tf.random_normal([1,3,3,5])) # 卷积核尺寸*2,输入通道,输出通道,
filter = tf.Variable(tf.random_normal([1,1,5,1])) # 《-----卷积核初始化 conv = tf.nn.conv2d(input, filter, strides=[1, 1, 1, 1], padding='VALID') sess.run(tf.global_variables_initializer())
print(sess.run(conv).shape)
(1, 3, 3, 1)

torch.nn.Conv2d

troch集成了初始化核的部分,所以自行初始化时需要直接修改变量的data

本篇很多例子中都对module的属性直接操作,其大多数是可学习参数,一般会随着学习的进行而不断改变。实际使用中除非需要使用特殊的初始化,应尽量不要直接修改这些参数。

import torch as t
input = t.normal(means=t.zeros([1,5,3,3]), std=t.Tensor([0.1]).expand([1,5,3,3]))
input = t.autograd.Variable(input) # 输入通道,输出通道,卷积核尺寸,步长,是否偏执
conv = t.nn.Conv2d(5, 1, (1, 1), 1, bias=False) # 输出通道,输入通道,卷积核尺寸*2
print([n for n,p in conv.named_parameters()])
conv.weight.data = t.ones([1,5,1,1]) # 《-----卷积核初始化,可有可无 out = conv(input)
print(out.size())
['weight']
torch.Size([1, 1, 3, 3])

池化

tensorflow.nn.avg_pool

torch.nn.AvgPool2d

可以验证没有学习参数

pool = nn.AvgPool2d(2,2)
list(pool.parameters())
[]

线性

torch.nn.Linear

# 输入 batch_size=2,维度3
input = V(t.randn(2, 3))
linear = nn.Linear(3, 4)
h = linear(input)
print(h)
Variable containing:
-1.4189 -0.2045 1.2143 -1.5404
0.8471 -0.3154 -0.5855 0.0153
[torch.FloatTensor of size 2x4]

BatchNorm

『TensorFlow』批处理类

torch.nn.BatchNorm1d

BatchNorm:批规范化层,分为1D、2D和3D。除了标准的BatchNorm之外,还有在风格迁移中常用到的InstanceNorm层。

# 4 channel,初始化标准差为4,均值为0
bn = nn.BatchNorm1d(4)
print([n for n,p in bn.named_parameters()])
bn.weight.data = t.ones(4) * 4
bn.bias.data = t.zeros(4) bn_out = bn(h)
# 注意输出的均值和方差
# 方差是标准差的平方,计算无偏方差分母会减1
# 使用unbiased=False 分母不减1
bn_out.size(), bn_out.mean(0), bn_out.var(0, unbiased=False)
['weight', 'bias']
(torch.Size([2, 4]), 

 Variable containing:
1.00000e-06 *
0.0000
-1.0729
0.0000
0.1192
[torch.FloatTensor of size 4], Variable containing:
15.9999
15.9481
15.9998
15.9997
[torch.FloatTensor of size 4])

Dropout

tensorflow.nn.dropout

torch.nn.Dropout

dropout层,用来防止过拟合,同样分为1D、2D和3D。 下面通过例子来说明它们的使用。

 # 每个元素以0.5的概率舍弃
dropout = nn.Dropout(0.5)
o = dropout(bn_out)
o # 有一半左右的数变为0
Variable containing:
-7.9895 -7.9931 7.9991 7.9973
0.0000 0.0000 -7.9991 -7.9973
[torch.FloatTensor of size 2x4]

激活函数

PyTorch实现了常见的激活函数,其具体的接口信息可参见官方文档^3,这些激活函数可作为独立的layer使用。这里将介绍最常用的激活函数ReLU,其数学表达式为:

relu = nn.ReLU(inplace=True)
input = V(t.randn(2, 3))
print(input)
output = relu(input)
print(output) # 小于0的都被截断为0
# 等价于input.clamp(min=0)
Variable containing:
-0.8472 1.0046 0.7245
0.3567 0.0032 -0.5200
[torch.FloatTensor of size 2x3] Variable containing:
0.0000 1.0046 0.7245
0.3567 0.0032 0.0000
[torch.FloatTensor of size 2x3]

有关inplace:

ReLU函数有个inplace参数,如果设为True,它会把输出直接覆盖到输入中,这样可以节省内存/显存。之所以可以覆盖是因为在计算ReLU的反向传播时,只需根据输出就能够推算出反向传播的梯度。但是只有少数的autograd操作支持inplace操作(如variable.sigmoid_()),除非你明确地知道自己在做什么,否则一般不要使用inplace操作。

交叉熵

import torch as t
from torch.autograd import Variable as V score = V(t.randn(3,2))
label = V(t.Tensor([1,0,1])).long()
loss_fn = t.nn.CrossEntropyLoss()
loss = loss_fn(score,label)
print(loss)

Variable containing:
 1.3535
[torch.FloatTensor of size 1]

损失函数和nn.Module的其他class没什么不同,不过实际使用时往往单独提取出来(书上语)。

ReLU(x)=max(0,x)

『PyTorch x TensorFlow』第八弹_基本nn.Module层函数的更多相关文章

  1. 『PyTorch x TensorFlow』第六弹_从最小二乘法看自动求导

    TensoFlow自动求导机制 『TensorFlow』第二弹_线性拟合&神经网络拟合_恰是故人归 下面做了三个简单尝试, 利用包含gradients.assign等tf函数直接构建图进行自动 ...

  2. 『TensorFlow』第七弹_保存&载入会话_霸王回马

    首更: 由于TensorFlow的奇怪形式,所以载入保存的是sess,把会话中当前激活的变量保存下来,所以必须保证(其他网络也要求这个)保存网络和载入网络的结构一致,且变量名称必须一致,这是caffe ...

  3. 『TensorFlow』第十一弹_队列&多线程&TFRecod文件_我辈当高歌

    TF数据读取队列机制详解 一.TFR文件多线程队列读写操作 TFRecod文件写入操作 import tensorflow as tf def _int64_feature(value): # val ...

  4. 『TensorFlow』第十弹_队列&多线程_道路多坎坷

    一.基本队列: 队列有两个基本操作,对应在tf中就是enqueue&dequeue tf.FIFOQueue(2,'int32') import tensorflow as tf '''FIF ...

  5. 『TensorFlow』第三弹_可视化框架介绍_悄悄问圣僧

    添加记录节点 -> 汇总记录节点 -> run汇总节点 -> [书写器生成]书写入文件 [-> 刷新缓冲区] 可视化关键点: 注意, 1.with tf.name_scope( ...

  6. 『MXNet』第八弹_数据处理API_下_Image IO专题

    想学习MXNet的同学建议看一看这位博主的博客,受益良多. 在本节中,我们将学习如何在MXNet中预处理和加载图像数据. 在MXNet中加载图像数据有4种方式. 使用 mx.image.imdecod ...

  7. 『MXNet』第八弹_数据处理API_上

    一.Gluon数据加载 下面的两个dataset处理类一般会成对出现,两个都可做预处理,但是由于后面还可能用到原始图片,.ImageFolderDataset不加预处理的话可以满足,所以建议在.Dat ...

  8. 『PyTorch』第四弹_通过LeNet初识pytorch神经网络_下

    『PyTorch』第四弹_通过LeNet初识pytorch神经网络_上 # Author : Hellcat # Time : 2018/2/11 import torch as t import t ...

  9. 『PyTorch × TensorFlow』第十七弹_ResNet快速实现

    『TensorFlow』读书笔记_ResNet_V2 对比之前的复杂版本,这次的torch实现其实简单了不少,不过这和上面的代码实现逻辑过于复杂也有关系. 一.PyTorch实现 # Author : ...

随机推荐

  1. Linux中Postfix邮件原理介绍(一)

    邮件相关协议 SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议, 工作在TCP的25端口.它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式 ...

  2. Python3 tesseract加载chi_sim异常停止工作

    Python3 tesseract加载chi_sim异常停止工作 原因: chi_sim.traineddata 和 tesseract3.0.2 版本不一致: 解决方案: 下载tesseract3. ...

  3. Android实践项目汇报(二)

    Google天气客户端 本周学习计划 学习布局控件和XML解析的相关知识. 看懂程序代码. 把借鉴代码成功导入到Android Studio中并运行成功. 实际完成情况 我学习到布局控件XML在res ...

  4. luogu4473 BZOJ2143 2011[国家集训队]飞飞侠

    题目戳这里 有问题可以在博客@ 应该还会有人来看吧,嘻嘻 正题: 题目大意: 题目很清楚,就是一个点有一定的范围,会有一定的花费 求三个点中的任意两个点到另一个点的最小花费 (麻麻教育我千万读好题目( ...

  5. redis安装使用配置

    一.安装前的准备 下载redis http://redis.io/download https://github.com/mythz/redis-windows 下载Windows版客户端net版sd ...

  6. 用python + hadoop streaming 编写分布式程序(二) -- 在集群上运行与监控

    写在前面 相关随笔: Hadoop-1.0.4集群搭建笔记 用python + hadoop streaming 编写分布式程序(一) -- 原理介绍,样例程序与本地调试 用python + hado ...

  7. Web前端代码规范

    新增:http://materliu.github.io/code-guide/#project-naming HTML 原则1.规范 .保证您的代码规范,保证结构表现行为相互分离.2.简洁.保证代码 ...

  8. UVa 1152 和为0的4个值(二分查找)

    https://vjudge.net/problem/UVA-1152 题意:给定4个n元素集合A,B,C,D,要求分别从中选取一个元素a,b,c,d,使得a+b+c+d=0.问有多少种取法. 思路: ...

  9. springmvc+druid+dataSource配置的两种方式

    一.一般的配置方式 数据库连接配置在jdbc.properties文件中,这种方式有一个最大的缺点,数据库的配置信息对开发人员是完全可见的,十分方便程序员删库跑路.spring配置具体如下: 1.jd ...

  10. R语言低级绘图函数-abline 转载

    abline 函数的作用是在一张图表上添加直线, 可以是一条斜线,通过x或y轴的交点和斜率来确定位置:也可以是一条水平或者垂直的线,只需要指定与x轴或y轴交点的位置就可以了 常见用法: 1)添加直线 ...