tensorflow模型查看参数(pytorch conv2d函数详解)

tf.nn.conv2d()参数解析

大家好,又见面了,我是你们的朋友全栈君。

定义:
tf.nn.conv2d(input, filter, strides, padding, use_cudnn_on_gpu=None, data_format=None, name=None)
功能:将两个4维的向量input(样本数据矩阵)和filter(卷积核)做卷积运算,输出卷积后的矩阵
input的形状:[batch, in_height ,in_width, in_channels]
batch: 样本的数量
in_height :每个样本的行数
in_width: 每个样本的列数
in_channels:每个样本的通道数,如果是RGB图像就是3
filter的形状:[filter_height, filter_width, in_channels, out_channels]
filter_height:卷积核的高
filter_width:卷积核的宽
in_channels:输入的通道数
out_channels:输出的通道数
比如在tensorflow的cifar10.py文件中有句:
这里写图片描述
卷积核大小为 5*5,输入通道数是3,输出通道数是64,即这一层输出64个特征
在看cifar10.py里第二层卷积核的定义:
这里写图片描述
大小依然是5*5,出入就是64个通道即上一层的输出,输出依然是64个特征
strides:[1,stride_h,stride_w,1]步长,即卷积核每次移动的步长
padding:填充模式取值,只能为”SAME”或”VALID”
卷积或池化后的节点数计算公式:
output_w = int((input_w + 2*padding – filter_w)/strid_w) + 1
举例说明:
假设这里使用的图像每副只有一行像素一通道,共3副图像

>>> a = np.array([[1,1,1],[2,2,2],[3,3,3]])
>>> b=tf.reshape(a,[a.shape[0],1,a.shape[1],1])
>>> init = tf.initialize_all_variables()
>>> sess.run(init)
>>> sess.run(b)
array([[[[1], [1], [1]]], [[[2], [2], [2]]], [[[3], [3], [3]]]])

然后设有2个1*2的卷积核

>>> k=tf.constant([[[[ 1.0, 1.0]],[[2.0, 2.0]]]], dtype=tf.float32)
>>> mycov=tf.nn.conv2d(b, k, [1, 1, 1, 1], padding='SAME')
>>> init = tf.initialize_all_variables()
>>> sess.run(init)
>>> sess.run(mycov)
array([[[[ 3., 3.], [ 3., 3.], [ 1., 1.]]], [[[ 6., 6.], [ 6., 6.], [ 2., 2.]]], [[[ 9., 9.], [ 9., 9.], [ 3., 3.]]]], dtype=float32)
>>> sess.run(b)
array([[[[ 1.], [ 1.], [ 1.]]], [[[ 2.], [ 2.], [ 2.]]], [[[ 3.], [ 3.], [ 3.]]]], dtype=float32)
>>> sess.run(k)
array([[[[ 1., 1.]], [[ 2., 2.]]]], dtype=float32)

这里写图片描述
最后的0是函数自动填充的,所以最后就得到了一个2通道的卷积结果
将k改成[[ 1.0, 0.5],[2, 1]]然后再次运行:

>>> k=tf.constant([[[[ 1.0, 0.5]],[[2, 1]]]], dtype=tf.float32)
>>> mycov=tf.nn.conv2d(b, k, [1, 1, 1, 1], padding='SAME')
>>> init = tf.initialize_all_variables()
>>> sess.run(init)
>>> sess.run(mycov)
array([[[[ 3. , 1.5], [ 3. , 1.5], [ 1. , 0.5]]], [[[ 6. , 3. ], [ 6. , 3. ], [ 2. , 1. ]]], [[[ 9. , 4.5], [ 9. , 4.5], [ 3. , 1.5]]]], dtype=float32)

卷积核一般用tf.get_variable()初始化,这里为了演示直接指定为常量

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/129729.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • windows下安装MinGW及C++的环境配置

    windows下安装MinGW及C++的环境配置方法一——VS:  使用windows开发神器visiostudio。这种方法比较简单,直接下载一个最新的vs安装就行。不单单是C++,C、C#、VB等都可以开发。方法二——只安装C++编译器:  最常用的免费可用的编译器是GNU的C/C++编译器,为了在Windows上安装GCC,您需要安装MinGW。1.首先去MinGW主页下载最新版本的MinGW: www…

  • Java学习之动态代理篇

    Java学习之动态代理篇0x00前言在后面的漏洞研究的学习中,必须要会的几个知识点。反射机制和动态代理机制。至于反射的前面已经讲到过了,这里就不做更多的赘述了。0x01动态代理这里先来讲一

    2021年12月12日
  • js数组删除某个值_数组删除指定下标元素

    js数组删除某个值_数组删除指定下标元素方法利用indexOf以及splice来删除指定的值案例vararray=[2,5,9];varindex=array.indexOf(5);array.splice(index,1);}splice两个参数、第一个开始删除的下标、第二个删除的数量

  • vs2010 序列号「建议收藏」

    vs2010 序列号「建议收藏」序列号:YCFHQ-9DWCY-DKV88-T2TMH-G7BHP从网上搜的,经测试,可用信息来源:http://blog.163.com/ldy_3881685/blog/static/32380136201031333921823/示意图环境windows7旗舰中文+vs2010旗舰英文,vs2010自己从官网下载试用版本,然后输入序列号的步骤同vs200…

  • C++实现堆排序算法[通俗易懂]

    1.实现堆排序算法   用C++实现一个堆排序。2.实现思想① 先将初始文件R[1..n]建成一个大根堆,此堆为初始的无序区 ② 再将关键字最大的记录R[1](即堆顶)和无序区的最后一个记录R[n]交换, 由此得到新的无序区R[1..n-1]和有序区R[n],且满足R[1..n-1].keys≤R[n].key。③ 由于交换后新的根R[1]可能违反堆性质,故应将当前无序…

  • vue父组件引入子组件_vue子组件传递方法给父组件

    vue父组件引入子组件_vue子组件传递方法给父组件子组件代码<template> <divclass=”item”@click=”gotoView($event)”> <divclass=”iconfont-box”> <slot></slot> </div> <divclass=”title”>Blog</div> </div></template><script>export

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号