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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • linux删除用户名命令,linux删除用户命令

    linux删除用户名命令,linux删除用户命令Linux下删除以后的时候我们需要通过相关的命令来实现。下面由学习啦小编为大家整理linux删除用户命令的相关知识,希望对大家有帮助!linux删除用户命令简介userdel是一个底层用于删除用户的工具。在Debian上,我们通常会使用deluser命令。userdel会查询系统账户文件,例如/etc/password和/etc/group。那么它会删除所有和用户名相关的条目。在…

  • C++实现超分辨率 RDN

    C++实现超分辨率 RDNRDN(由残差密集网络实现的图像超分辨率)在《RDN-TensorFlow-master》有一个3倍模型(也只有这一个了):rdn_5_3_64_x3这里用C++实现这个的3倍重建:流程图:密集残差块:这个残差块结构内部和前面的ESRGAN(前面的文章)中的密集残差块是一样的,只是外部有点不同。定义密集残差块:struct密集残差块//4个卷积层…

  • Linux如何通过命令查看日志文件的某几行(中间几行或最后几行)「建议收藏」

    Linux如何通过命令查看日志文件的某几行(中间几行或最后几行)

  • 2019美赛A题翻译

    2019美赛A题翻译(新)2019美赛A题思路详解(纯干货)https://blog.csdn.net/i_CodeBoy/article/details/866636282019MCM问题A:权利的游戏在虚构的电视连续剧“权力的游戏”中,基于一系列史诗般的幻想小说“冰与火之歌”[1],三只龙是由“龙之母”的DaenerysTargaryen养育。刚刚孵化时,龙是小的,大约10公…

  • Restsharp_handler.post

    Restsharp_handler.post1.加入依赖RestSharpNewtonsoft.Json2.编写json、form-data请求代码usingMicrosoft.AspNetCore.Mvc;usingNewtonsoft.Json;usingNewtonsoft.Json.Linq;usingRestSharp;usingRestTemplate.model;namespaceRestTemplate.Controllers{[Route(“api/[controller]”)]

  • Xmpp学习之Android-smack入门指导

    Xmpp学习之Android-smack入门指导Xmpp学习之Androidsmack入门指导版权声明:本文为博主原创文章,未经博主允许不得转载。转载请表明出处:http://www.cnblogs.com/cavalier/p/69404

发表回复

您的电子邮箱地址不会被公开。

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