python实现卷积操作

调用tf.nn.conv2d()实现卷积
自己实现卷积函数

我们知道,tensorflow里面自带卷积函数,tf.nn.conv2d()就可以实现相关功能,本文主要是自己实现卷积操作,然后和tf.nn.conv2d()函数的结果对比,验证正确性。
调用tf.nn.conv2d()实现卷积
首先是调用卷积函数实现卷积操作:
这里说明一下conv2d的定义及参数含义: 参考
【定义:】
tf.nn.conv2d (input, filter, strides, padding, use_cudnn_on_gpu=None, data_format=None, name=None)
【参数:】
input : 输入的要做卷积的图片,要求为一个张量,shape为 [ batch, in_height, in_weight, in_channel ],其中batch为图片的数量,in_height 为图片高度,in_weight 为图片宽度,in_channel 为图片的通道数,灰度图该值为1,彩色图为3。(也可以用其它值,但是具体含义不是很理解)
filter: 卷积核,要求也是一个张量,shape为 [ filter_height, filter_weight, in_channel, out_channels ],其中 filter_height 为卷积核高度,filter_weight 为卷积核宽度,in_channel 是图像通道数 ,和 input 的 in_channel 要保持一致,out_channel 是卷积核数量。
strides: 卷积时在图像每一维的步长,这是一个一维的向量,[ 1, strides, strides, 1],第一位和最后一位固定必须是1
padding: string类型,值为“SAME” 和 “VALID”,表示的是卷积的形式,是否考虑边界。"SAME"是考虑边界,不足的时候用0去填充周围,"VALID"则不考虑
use_cudnn_on_gpu: bool类型,是否使用cudnn加速,默认为true

import tensorflow as tf
import numpy as np
input = np.array([[1,1,1,0,0],[0,1,1,1,0],[0,0,1,1,1],[0,0,1,1,0],[0,1,1,0,0]])
input = input.reshape([1,5,5,1]) #因为conv2d的参数都是四维的,因此要reshape成四维
kernel = np.array([[1,0,1],[0,1,0],[1,0,1]])
kernel = kernel.reshape([3,3,1,1]) #kernel也要reshape
print(input.shape,kernel.shape) #(1, 5, 5, 1) (3, 3, 1, 1)x = tf.placeholder(tf.float32,[1,5,5,1])
k = tf.placeholder(tf.float32,[3,3,1,1])
output = tf.nn.conv2d(x,k,strides=[1,1,1,1],padding='VALID')with tf.Session() as sess:y = sess.run(output,feed_dict={x:input,k:kernel})print(y.shape) #(1,3,3,1)print(y) #因为y有四维,输出太长了,我就只写一下中间两维的结果(3*3部分):[[4,3,4],[2,4,3],[2,3,4]]

自己实现卷积函数
下面我们自己实现一个卷积操作,就不care batch和channel那两维了,直接拿中间的二维为例。下面是 实现的代码(我这个太偷懒了,步长、padding这些都没有考虑进去):

import numpy as np
input = np.array([[1,1,1,0,0],[0,1,1,1,0],[0,0,1,1,1],[0,0,1,1,0],[0,1,1,0,0]])
kernel = np.array([[1,0,1],[0,1,0],[1,0,1]])
print(input.shape,kernel.shape)def my_conv(input,kernel):output_size = (len(input)-len(kernel)+1)res = np.zeros([output_size,output_size],np.float32)for i in range(len(res)):for j in range(len(res)):res[i][j] = compute_conv(input,kernel,i,j)return resdef compute_conv(input,kernel,i,j):res = 0for kk in range(3):for k in range(3):print(input[i+kk][j+k])res +=input[i+kk][j+k]*kernel[kk][k]  #这句是关键代码,实现了两个矩阵的点乘操作return res
print(my_conv(input,kernel)) 

输出:

[[4. 3. 4.]
 [2. 4. 3.]
 [2. 3. 4.]]
————————————————
版权声明:本文为CSDN博主「aaon22357」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:

python 实现卷积操作相关推荐

  1. DeepLearning:手动编辑python实现卷积操作

    目前的深度学习框架真正去实现卷积的时候,使用的是矩阵乘法的方式,使用im2col操作将输入数据与权重展开成二维矩阵,然后直接做矩阵乘法, 缺点是占用许多内存.具体原理看下面这张图就能明白: 图片的上面 ...

  2. 基于Python的卷积神经网络和特征提取

     基于Python的卷积神经网络和特征提取 发表于2015-08-27 21:39| 4577次阅读| 来源blog.christianperone.com/| 13 条评论| 作者Christi ...

  3. 【深度学习】越来越卷,教你使用Python实现卷积神经网络(CNN)

    @Author:Runsen https://blog.csdn.net/weixin_44510615/article/details/117409037 卷积神经网络 Yann LeCun 和Yo ...

  4. python的文件操作、模块操作、os模块、time、datatime模块以及模块的制作

    Day12新手小白学python 第十二节 python的文件操作.模块操作.os模块.time.datatime模块以及模块的制作 目录 Day12新手小白学python 前言 一.文件打开关闭 二 ...

  5. 【深度学习入门】——亲手实现图像卷积操作

    深度学习中有一个很重要的概念就是卷积神经网络 CNN,卷积神经网络中又有卷积层.池化层的概念.尤其是卷积层,理解难度比较大,虽然书中或者是视频中都有详细介绍过它的基础概念,但对于求知欲望很强烈的我,我 ...

  6. 人工智能:如何使用opencv4 和python实现卷积功能

    Neural Networks and Deep Learning基础介绍 Inception系列 从ResNet到DenseNet tensorflow中文社区 这个博客主要通过回答以下几个问题来实 ...

  7. Python模块MySQLdb操作mysql出现2019错误:Can't initialize character set utf-8

    我使用python的MySQLdb模块实现了一个mysql client, 在测试时,出现了如下错误 Python模块MySQLdb操作mysql出现2019错误:Can't initialize c ...

  8. Python 炫技操作:合并字典的七种方法

    来源 | Python编程时光(ID: Cool-Python) Python 语言里有许多(而且是越来越多)的高级特性,是 Python 发烧友们非常喜欢的.在这些人的眼里,能够写出那些一般开发者看 ...

  9. Python OpenCV像素操作

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自:opencv学堂 Python OpenCV像素操作 环 ...

最新文章

  1. SAP QM 含有Long-term检验特性的检验批UD完成后还能继续录入检验结果?
  2. 非常好的一篇对linux信号(signal)的解析
  3. Linux下boost库的安装
  4. 写在S3C2440A平台+winCE5.0+NAND +HIVE注册表的实现
  5. linux svn 备份脚本,SVN热备份脚本
  6. php form表单属性,HTML5 表单属性
  7. MYSQL:RELPACE用法
  8. 解决 ”To prevent a memory leak, the JDBC Driver has been forcibly unregistered“
  9. Towards Fine-Grained Prosody Control for Voice Conversion 论文理解
  10. 心理压力测试软件,心理压力测试
  11. idea Push Tags选All还是Current Branch?
  12. 关系网络lbs的应用_冒泡网王江:熟人关系将成LBS最重要商业模式
  13. 教学中常用的计算机软件及作用,信息技术教学中常用的教学方法有哪些
  14. 腾讯TDSQL全时态数据库系统论文入选VLDB
  15. 编程啦1001_超级最小公倍数
  16. 查看网卡信息中qdisc和pfifo _fast是什么
  17. Linux系统的登录方式
  18. 公告:CSDN个人空间即将改版
  19. BigDecimal的用法之乘除、保留小数
  20. 用微博帐号登录出错了! 对第三方应用进行授权时出现错误,请您联系第三方应用的开发者: 十五发芽或者稍后再试。 错误码:21322 重定向地址不匹配

热门文章

  1. 堆溢出DWORD SHOOT原理
  2. 详解PHP spl_autoload_register()函数
  3. Java中的Timer和Timer Task详解
  4. CentOS 7.2搭建NFS并使用
  5. 大数据教父Micheal Stonebraker告诉你大数据的秘密
  6. 十张图解释机器学习的基本概念
  7. matlab中imresize函数的用法,为何 MATLAB imresize 函数和 OpenCV resize 函数结果不同
  8. 算法 - 求一个正整数的二进制表示中1的个数(C++)
  9. 数据结构 - 有两个链表,第一个升序,第二个降序,合并为一个升序链表(C++)
  10. 长方形纸做容积最大的长方体_儿童手工折纸,童年玩具纸扇子怎么折?一起来回忆下经典折法吧...