python实现卷积操作

python实现卷积操作文章目录调用tf.nn.conv2d()实现卷积自己实现卷积函数我们知道,tensorflow里面自带卷积函数,tf.nn.conv2d()就可以实现相关功能,本文主要是自己实现卷积操作,然后和tf.nn.conv2d()函数的结果对比,验证正确性。调用tf.nn.conv2d()实现卷积首先是调用卷积函数实现卷积操作:这里说明一下conv2d的定义及参数含义:参考【定义:】tf.n…

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

我们知道,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 res

def compute_conv(input,kernel,i,j):
    res = 0
    for 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.]]
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

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

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


相关推荐

  • mysql卸载与安装_cad卸载后无法重新安装

    mysql卸载与安装_cad卸载后无法重新安装以Windows10操作系统为例:一、先看看如何卸载1、首先,停止window的MySQL服务,【windows键+R】打开运行框,输入【services.msc】打开(或者找到“控制面板”->“管理工具”->“服务”,停止MySQL后台服务)服务管理器,停止MySQL后台服务。2、卸载MySQL安装程序。找到“控制面板”->”程序…

    2022年9月30日
    4
  • python 函数嵌套和nonlocal关键字

    python 函数嵌套和nonlocal关键字python函数可以嵌套使用,使用也比较简单,举个栗子:defouter():print("outer")definner():print("inner")inner()outer()##运行结果:outerinnernonlocal关键字:与global关键字有点相似,可以对比着理解。nonlocal关键字只能作用域局…

    2025年9月18日
    5
  • sqlserver将截断字符串或二进制数据_达梦数据库字符串截断

    sqlserver将截断字符串或二进制数据_达梦数据库字符串截断报的是下面这个错误:原因:在设计表时字段长度给的太小可以查看一下自己数据库中的字段的长度,看是否符合自己需要的长度怎么解决?1)将表中数据类型长度扩大2)减少插入的字符串

    2022年8月31日
    3
  • 单片机开发系列(一)之Keil 5 安装使用教程「建议收藏」

    单片机开发系列(一)之Keil 5 安装使用教程「建议收藏」、Keil安装教程   -Keil5安装包 链接:https://pan.baidu.com/s/1QitX09pqh6uZVdjj48Dllw密码:69yx   -下载链接中的安装包,进行安装,在安装完成后,开始以下的激活步骤   -运行安装的Keil5点击File->liselicensemanagement,将图片中的CID进行复制 …

    2022年5月23日
    48
  • CPLD和FPGA的区别和联系「建议收藏」

    CPLD和FPGA的区别和联系「建议收藏」CPLD和CPU接口:1、CPLD大部分是做为CPU的扩展,替CPU完成外部引脚资源的扩展、输入输出时序管理、部分软件功能实现,肯少单独用CPLD。2、初学者使用CPLD时,可以在IO连线中串联一个51欧姆的电阻,方便测量,更重要的是能保护CPLD的IO,更深一步是能改善高速信号的振铃、信号反射。提高信号完整性。参考:FPGA和CPLD对比与入门FPGA与CPLD的区别…

    2022年6月4日
    34
  • 命令行mvn打包的时候报错:No compiler is provided in this environment. Perhaps you are running on a JRE

    命令行mvn打包的时候报错:No compiler is provided in this environment. Perhaps you are running on a JRE一 前言这部分是安装 Elasticsearc ik 中文分词的时候 用 mvn 打包报错 Nocompileris Perhapsyouar 在网上百度 大部分是讲解 IDE 的解决方案 但是我这边是用的命令行 有点坑爹 还是记录一下吧 二 解决过程 1 错

    2025年11月15日
    3

发表回复

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

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