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忘记密码和密码重置

    Mysql忘记密码和密码重置**Mysql忘记密码和密码重置**环境:系统Windows10MySQL-8.0.23操作步骤:1、停止MySQL服务打开命令窗口cmd,输入命令:netstopmysql,停止MySQL服务2、开启跳过密码验证登录的MySQL服务打开命令窗口cmd,进入mysql安装目录下的bin目录,然后输入如下这条命令`mysqld–shared-memory–skip-grant-tables`3、重新打开一个cmd命令窗口,输入mysql命令就可以直接登录了,直接

    2022年6月17日
    20
  • http请求报400报错

    http请求报400报错400是HTTP的状态码,主要有两种形式:1、badrequest意思是“错误的请求”;2、invalidhostname意思是“不存在的域名”。在ajax请求后台数据时有时会报HTTP400错误-请求无效(Badrequest);出现这个请求无效报错说明请求没有进入到后台服务里;1、确认发送的数据格式是否正确。调试查看你发送的数据格式是否正确或是否有乱码…

    2022年6月12日
    95
  • 汉字转拼音 文字集

    汉字转拼音 文字集publicclassChEnRow{publicstring[]enfull;}privatestaticList<ChEnRow>CEFullTable=newList<ChEnRow>{newChEnRow{enfull=newstring[]{“a,啊阿呵吖嗄腌锕錒”,”ai…

    2022年6月21日
    26
  • XStream笔记「建议收藏」

    XStream笔记「建议收藏」XStream是一套简洁易用的开源类库,用于将Java对象序列化为XML或者将XML反序列化为Java对象,是Java对象和XML之间一个双向转换器。1.XStream概述2.快速入门User.java: publicclassUserimplementsSerializable{ privatestaticfinallongserialVersionU…

    2025年7月6日
    3
  • python进制转换函数-Python中进制转换函数的使用

    python进制转换函数-Python中进制转换函数的使用Python中进制转换函数的使用关于Python中几个进制转换的函数使用方法,做一个简单的使用方法的介绍,我们常用的进制转换函数常用的就是int()(其他进制转换到十进制)、bin()(十进制转换到二进制)、oct()(十进制转换到八进制)、hex()(十进制转换到十六进制)。下面我们逐个说下每个函数的用法。binbin()函数,是将十进制的数字转换成二进制的数字。其中bin()函数中传入的是十进…

    2022年5月19日
    36
  • java getclassloader_Java中getClassLoader().getResource()和getResource()的区别

    java getclassloader_Java中getClassLoader().getResource()和getResource()的区别在Java中需要加载一个文件时,使用getResource()方法进行加载,会报错[Causedby:java.lang.NullPointerException:Locationisrequired.这是对.getClass().getClassLoader().getResource()和.getClass().getResource()的理解不够深入的原因。经过查询相关资料后终于明…

    2022年6月8日
    38

发表回复

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

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