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()初始化,这里为了演示直接指定为常量

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 从单一到融合,扫地机器人导航技术的“最优解”?

    从单一到融合,扫地机器人导航技术的“最优解”?人工智能浪潮下,智能家居产品层出不穷,但纵观行业发展能真正走入家庭中的产品屈指可数,而扫地机器人却是其中的“网红产品”。根据中怡康数据显示,2013年,我国扫地机器人市场规模仅为8.4亿元,而到了2020年,市场规模已达到94亿元。快速增长的市场同时也在倒逼扫地机器人的性能不断提升“下限”,尤其智能化已成为扫地机器人的高附加值特征。循次渐进,扫地机器人正逐步“完善”在经历2019年的市场寒潮后,2020年扫地机市场快速回暖,除了受疫情影响之外,最关键的原因仍是扫地机器人技术的创新和进步。尤其是各

    2022年5月30日
    36
  • 基于SRS的视频直播服务器搭建

    基于SRS的视频直播服务器搭建srs提供的一个demo实例,包括实时流的rtmp播放,hls播放,视频会议,ffmpeg视频变换,jwplayer播放,OSMF播放,vlc播放等等功能.

    2022年6月7日
    93
  • 卡方线性趋势检验_SPSS:趋势卡方检验

    卡方线性趋势检验_SPSS:趋势卡方检验SPSS:趋势卡方检验毕业季接近尾声,通过答辩的各位同学们即将开始新的旅程。回顾论文点滴,想必既有心酸又充满欣慰。回顾毕业生咨询论文写作得到一个启示与各位分享:论文完成的过程也是还原临床研究的过程,论文收集资料后进行统计分析时,可以用的统计方法有很多,至于用什么统计方法,决定于临床研究的目的。举个例子:某同学收集到一些数据:近五年某医院胃镜报告提示胃溃疡的男性、女性患者人数,根据数据得到类似下面的…

    2022年5月13日
    54
  • EMWIN 使用记录

    EMWIN 使用记录EMWIN使用记录回调函数WM_PAINT其中出现pMsg->hWin是对话框的客户区句柄,其父句柄就是控件句柄WM_INIT_DIALOG其中出现pMsg->hWin是对话框控件句柄,控件函数使用CreatXXX返回的句柄为控件句柄,window控件可能需要除外…

    2022年10月14日
    2
  • expandablelistview详解[通俗易懂]

    expandablelistview详解[通俗易懂]我在项目中使用到expandablelistview,然后我就在网上找了很多关于expandablelistview的文章,那么这里,将一些对去进行总结一些,并将自己踩过的坑填上。expandablelistview就是类似QQ分组,点击分类,显示其各个详细的分类信息。下面是一些效果图这样是完成了有父标题,和子标题,实现了分组,接下来看看如何布局的。

    2022年6月18日
    29
  • CMPP讲解_cmpp2.0

    CMPP讲解_cmpp2.0  1 、缩略语解释  ISMG                         InternetShortMessageGateway     互联网短信网关

    2025年8月1日
    6

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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