TensorFlow使用记录 (二): 理解tf.nn.conv2d方法
方法定义
tf.nn.conv2d(input, filter, strides, padding, use_cudnn_on_gpu=True, data_format="NHWC", dilations=[1,1,1,1], name=None)
参数:
- input: 输入的要做卷积的数据体,要求是一个`Tensor`
- filter: 卷积核,要求也是一个`Tensor`, shape= [filter_height, filter_width, in_channels, out_channels], 其中 filter_height 为卷积核高度,filter_weight 为卷积核宽度,in_channel 是要做卷积的数据体的通道数 ,out_channel 是卷积核数量。
- strides: 卷积步长(1-D tensor of length 4), shape=[1, strides, strides, 1],第一位和最后一位固定是1
- padding: A `string` from: `"SAME", "VALID"`. "SAME" 表示使用0去填充边界, "VALID"则不填充
data_format: An optional `string` from: `"NHWC", "NCHW"`. Defaults to `"NHWC"`.
Specify the data format of the input and output data.
With the default format "NHWC", the data is stored in the order of: [batch, height, width, channels].name: A name for the operation (optional).
具体实现
input shape: [batch, in_height, in_width, in_channels]
filter shape: [filter_height, filter_width, in_channels, out_channels]
计算过程:
1. 将filter展开成2-D matrix, shape: [filter_height*filter_width*in_channels, output_channels]
2. 从input tensor中提取patches构成一个virtual tensor, shape: [batch, out_height, out_width, filter_height*filter_width*in_channels]
3. 对于每一个patch,右乘上1中的filter matrix。即 [batch, out_height, out_width, filter_height*filter_width*in_channels] x [filter_height * filter_width * in_channels, output_channels], 那么输出的shape: [batch, out_height, out_width, output_channels]
【注:必须有 strides[0] = strides[3] = 1】。绝大多数情况下,水平的stride和竖直的stride一样,即strides = [1, stride, stride, 1]。
输出结果的shape计算:
在caffe中是这样的:
out_height =floor(in_height+2*pad-filter_height)/stride+1; floor向下取整
out_width=floor(in_width+2*pad-filter_width)/stride+1
在TensorFlow中是这样的:
"SAME" 类型的padding:
out_height = ceil(in_height / strides[1]); ceil向上取整
out_width = ceil(in_width / strides[2])
"VALID"类型的padding:
out_height = ceil((in_height - filter_height + 1) / striders[1])
out_width = ceil((in_width - filter_width + 1) / striders[2]
验证代码
# -*- coding:utf-8 -*- from __future__ import division
import tensorflow as tf
import numpy as np
import math
import pandas as pd input_arr = np.zeros((12, 15), dtype=np.float32)
number = 0
for row_idx in range(input_arr.shape[0]):
for col_idx in range(input_arr.shape[1]):
input_arr[row_idx][col_idx] = number
number +=1 number = 6
w_arr = np.zeros((2, 3), dtype=np.float32)
for row_idx in range(w_arr.shape[0]):
for col_idx in range(w_arr.shape[1]):
w_arr[row_idx][col_idx] = number
number += 1 stride = [1, 1, 1, 1] # 从卷积的定义【实际上不是卷积,而是cross-correlation】进行计算验证---对VALID类型卷积进行
res_shape_h = int(math.ceil((input_arr.shape[0] - w_arr.shape[0] + 1) / stride[1]))
res_shape_w = int(math.ceil(input_arr.shape[1] - w_arr.shape[1] + 1) / stride[2])
validation_res = np.zeros(shape=(res_shape_h, res_shape_w), dtype=np.float32) for row_idx in range(validation_res.shape[0]):
for col_idx in range(validation_res.shape[1]):
patch = input_arr[row_idx : row_idx+w_arr.shape[0], col_idx : col_idx+w_arr.shape[1]]
# 这里的 * 实际上代表的是点积,即对应元素位置相乘
res = np.sum(patch * w_arr)
validation_res[row_idx][col_idx] = res print('result of convolution from its definition: validation_res')
print(validation_res)
pd.DataFrame(validation_res).to_csv('validation_res.csv', index = False, header=False) # 从TensorFlow实现出发
input_arr = np.reshape(input_arr, [1, input_arr.shape[0], input_arr.shape[1], 1])
w_arr = np.reshape(w_arr, [w_arr.shape[0], w_arr.shape[1], 1, 1]) # 输入Tensor, shape: [1, 12, 15, 1]
net_in = tf.constant(value=input_arr, dtype=tf.float32) # filter, shape: [2, 3, 1, 1]
W = tf.constant(value=w_arr, dtype=tf.float32) # TensorFlow卷积的计算结果
# valid卷积结果, shape: [1, 11, 13, 1]
result_conv_valid = tf.nn.conv2d(net_in, W, stride, 'VALID')
# same卷积结果, shape: [1, 12, 15, 1]
result_conv_smae = tf.nn.conv2d(net_in, W, stride, 'SAME') with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
valid_conv_res, same_conv_res = sess.run([result_conv_valid, result_conv_smae]) print(valid_conv_res.shape)
valid_conv_res = np.reshape(valid_conv_res, [valid_conv_res.shape[1], valid_conv_res.shape[2]])
same_conv_res = np.reshape(same_conv_res, [same_conv_res.shape[1], same_conv_res.shape[2]])
print('TensorFlow con res: valid_conv_res')
print(valid_conv_res)
pd.DataFrame(valid_conv_res).to_csv('conv_res.csv', index=False, header=False)
pd.DataFrame(same_conv_res).to_csv('same_res.csv', index=False, header=False)
TensorFlow使用记录 (二): 理解tf.nn.conv2d方法的更多相关文章
- 【TensorFlow】理解tf.nn.conv2d方法 ( 附代码详解注释 )
最近在研究学习TensorFlow,在做识别手写数字的demo时,遇到了tf.nn.conv2d这个方法,查阅了官网的API 发现讲得比较简略,还是没理解.google了一下,参考了网上一些朋友写得博 ...
- 深度学习原理与框架-Tensorflow卷积神经网络-卷积神经网络mnist分类 1.tf.nn.conv2d(卷积操作) 2.tf.nn.max_pool(最大池化操作) 3.tf.nn.dropout(执行dropout操作) 4.tf.nn.softmax_cross_entropy_with_logits(交叉熵损失) 5.tf.truncated_normal(两个标准差内的正态分布)
1. tf.nn.conv2d(x, w, strides=[1, 1, 1, 1], padding='SAME') # 对数据进行卷积操作 参数说明:x表示输入数据,w表示卷积核, stride ...
- 【TensorFlow】tf.nn.conv2d是怎样实现卷积的?
tf.nn.conv2d是TensorFlow里面实现卷积的函数,参考文档对它的介绍并不是很详细,实际上这是搭建卷积神经网络比较核心的一个方法,非常重要 tf.nn.conv2d(input, fil ...
- tf.nn.conv2d卷积函数之图片轮廓提取
一.tensorflow中二维卷积函数的参数含义:def conv2d(input, filter, strides, padding, use_cudnn_on_gpu=True, data_for ...
- tf.nn.conv2d 和 tf.nn.max_pool 中 padding 分别为 'VALID' 和 'SAME' 的直觉上的经验和测试代码
这个地方一开始是迷糊的,写代码做比较分析,总结出直觉上的经验. 某人若想看精准的解释,移步这个网址(http://blog.csdn.net/fireflychh/article/details/73 ...
- TF-卷积函数 tf.nn.conv2d 介绍
转自 http://www.cnblogs.com/welhzh/p/6607581.html 下面是这位博主自己的翻译加上测试心得 tf.nn.conv2d是TensorFlow里面实现卷积的函数, ...
- tf.nn.conv2d。卷积函数
tf.nn.conv2d是TensorFlow里面实现卷积的函数,参考文档对它的介绍并不是很详细,实际上这是搭建卷积神经网络比较核心的一个方法,非常重要 tf.nn.conv2d(input, fil ...
- tf.nn.conv2d 参数介绍
tf.nn.conv2d是TensorFlow里面实现卷积的函数,参考文档对它的介绍并不是很详细,实际上这是搭建卷积神经网络比较核心的一个方法,非常重要 tf.nn.conv2d(input, fil ...
- tf入门-tf.nn.conv2d是怎样实现卷积的?
转自:https://blog.csdn.net/mao_xiao_feng/article/details/78004522 实验环境:tensorflow版本1.2.0,python2.7 介绍 ...
随机推荐
- 测试基础_<一>
1: 过程决定质量, 测试过程贯穿整个软件开发声明周期; 2: 测试过程和开发过程在整个开发周期相辅相成; 3: 测试过程是对整个开发过程的验证, 二者互相依赖 4: 测试过程是整个测试活动中一个至关 ...
- GitHub从小白到熟悉<三>
上传文件
- python之函数、面向对象
学习python到了函数这一块进度有所放缓,主要还是想理解透彻,毕竟直觉告诉我函数是python是其中的关键,不管是模块.还是包.或者是库,都是建立在若干个函数定义上面. 章节后面就是关于面向对象编程 ...
- gunicorn 介绍与性能分析
阅读此文前建议先阅读 我的博客 gunicorn 是一个 python wsgi http server,只支持在 unix 系统上运行 安装 gunicorn 其实是 python 的一个包,安装方 ...
- CentOS 7 防火墙常用操作及常见问题处理
一.常用操作 1.启动防火墙: systemctl start firewalld.service 2.关闭防火墙: systemctl stop firewalld.service 3.添加放行端口 ...
- jsp页面中使用 splitfn:split注意事项
我们有一个 字段存储内容是 xxxx意见~~@~~是 在页面上需要分开显示,格式为 xxx意见 是 使用 ${fn:split(comments, '~~@~~')[1]} 来分割是发现出现@符文字 ...
- gitlab操作笔记
基本命令 准备 1. 安装所需命令 sudo yum install curl openssh-server openssh-clients postfix cronie -y2. 安装SSH sud ...
- Java排序--排序算法(内排序)
常用内排序算法 我们通常所说的排序算法往往指的是内部排序算法,即需要排序的数据在计算机内存中完成整个排序的过程,当数据率超大或排序较为繁琐时常借助于计算机的硬盘对大数据进行排序工作,称之为外部排序算法 ...
- 笔记本电脑重装win7/win10系统教程
由于笔记本第一次重装系统会出现系统装不上,还有出现找不到有效硬盘分区,等等问题,然后这篇文章主要讲解BIOS设置的方法,用此BIOS设置,电脑用原本安装系统的方式,能有效地解决以上问题,这有两种方法解 ...
- QT多线程同步之QWaitcondition
使用到多线程,无可避免的会遇到同步问题,qt提供几种同步线程的方法,在这里讲一下QWaitcondition的简单使用. 一.QWaitcondition,是通过一个线程达到某种条件来唤起另一个线程来 ...