深度使用卷积--使用tensorflow实现卷积

上一篇我们了解了卷积的概念,并且使用numpy实现了卷积。但是现在其实很少会需要自己去实现卷积操作了,因为很多深度学习框架已经很好的封装了基础API甚至封装好了网络模型,比如tensorflow,pytorch,caffe等等。今天我们就使用tensorflow来实现卷积,顺便和我们自己实现的卷积结果对比,验证我们的实现是否正确。

tensorflow实现卷积

API介绍

tensorflow是一个数据流图,tf基础使用后面有时间会再从基础进行介绍,今天直接上卷积的使用了,主要用到的API就是tf.nn.conv2d
对参数进行简单介绍

tf.nn.conv2d(
    input,
    filter=None,
    strides=None,
    padding=None,
    use_cudnn_on_gpu=True,
    data_format='NHWC',
    name=None
)

input:输入数据shape为[batch, in_height, in_width, in_channels]
对应
[输入batch_size,输入图片宽度,输入图片高度,输入图片通道数(RGB就是3通道)]
filter:卷积核shape为[ filter_height, filter_weight, in_channel, out_channels ]
对应
[卷积核对高,卷积核对宽,上一层输入的通道数,卷积核的个数]
strides:计算卷积时的步长,[ 1, strides, strides, 1]
padding:填充方式,通过上一篇应该有比较深入的了解了,两种填充方式,“SAME” 和 “VALID”
use_cudnn_on_gpu:是否使用cudnn加速
data_format:数据格式,一般使用默认的NHWC,通道在最后
``

tensorflow代码实现

数据处理

我们还是用和上一篇一样的数据,回顾下在numpy里面我们使用的输入shape[batch,C,H,W]通道数是在前面,但是在tensorflow提供的API中默认是使用的NHWC,同理filter我们在使用numpy实现时shape是[C_out,C_in,H,W]在tf里要求的是[H,W,C_in,C_out]。
所以我们第一步需要对数据进行下处理,让他和我们要求对shape一致。

    #inputs输入为[3,9,9]先把batch那一维度expand,[1,3,9,9]
    inputs = np.expand_dims(inputs, axis=0)
    #使用transpose变形为tf需要的[1,9,9,3]
    inputs = inputs.transpose((0,2,3,1))
    # filter:[2,3,3,3]--[3,3,3,2]
    filter= filter.transpose((2,3,1,0))

tf实现卷积

def tf_conv(inputs,filter,padding='SAME'):
    #定义输入和输出placeholder
    # input = [batch, in_height, in_width, in_channels]
    # filter = [filter_height, filter_width, in_channels, out_channels]
    tf_inputs = tf.placeholder(shape=(1, 9, 9, 3), dtype=tf.float32)
    tf_filter = tf.placeholder(shape=(3, 3, 3, 2), dtype=tf.float32)
    conv = tf.nn.conv2d(tf_inputs, tf_filter, strides=[1, 1, 1, 1], padding=padding)
    #通过sess.run计算conv值
    with tf.Session() as sess:
        out = sess.run(conv,feed_dict={tf_inputs: inputs,tf_filter:filter})
        out = np.squeeze(out)
        return out

numpy实现结果

我们运行下在上一篇的代码结果:

numpy conv 
 [[[ 110.  186.  249.  312.  375.  438.  501.  564.  338.]
  [ 186.  297.  378.  459.  540.  621.  702.  783.  456.]
  [ 249.  378.  459.  540.  621.  702.  783.  864.  501.]
  [ 312.  459.  540.  621.  702.  783.  864.  945.  546.]
  [ 375.  540.  621.  702.  783.  864.  945. 1026.  591.]
  [ 438.  621.  702.  783.  864.  945. 1026. 1107.  636.]
  [ 501.  702.  783.  864.  945. 1026. 1107. 1188.  681.]
  [ 564.  783.  864.  945. 1026. 1107. 1188. 1269.  726.]
  [ 338.  456.  501.  546.  591.  636.  681.  726.  398.]]

 [[ 134.  231.  312.  393.  474.  555.  636.  717.  446.]
  [ 231.  378.  486.  594.  702.  810.  918. 1026.  627.]
  [ 312.  486.  594.  702.  810.  918. 1026. 1134.  690.]
  [ 393.  594.  702.  810.  918. 1026. 1134. 1242.  753.]
  [ 474.  702.  810.  918. 1026. 1134. 1242. 1350.  816.]
  [ 555.  810.  918. 1026. 1134. 1242. 1350. 1458.  879.]
  [ 636.  918. 1026. 1134. 1242. 1350. 1458. 1566.  942.]
  [ 717. 1026. 1134. 1242. 1350. 1458. 1566. 1674. 1005.]
  [ 446.  627.  690.  753.  816.  879.  942. 1005.  590.]]] 

tensorflow运行结果

运行下今天介绍的调用tensorflow的卷积API运行的结果:

tf conv 
 [[[ 110.  186.  249.  312.  375.  438.  501.  564.  338.]
  [ 186.  297.  378.  459.  540.  621.  702.  783.  456.]
  [ 249.  378.  459.  540.  621.  702.  783.  864.  501.]
  [ 312.  459.  540.  621.  702.  783.  864.  945.  546.]
  [ 375.  540.  621.  702.  783.  864.  945. 1026.  591.]
  [ 438.  621.  702.  783.  864.  945. 1026. 1107.  636.]
  [ 501.  702.  783.  864.  945. 1026. 1107. 1188.  681.]
  [ 564.  783.  864.  945. 1026. 1107. 1188. 1269.  726.]
  [ 338.  456.  501.  546.  591.  636.  681.  726.  398.]]

 [[ 134.  231.  312.  393.  474.  555.  636.  717.  446.]
  [ 231.  378.  486.  594.  702.  810.  918. 1026.  627.]
  [ 312.  486.  594.  702.  810.  918. 1026. 1134.  690.]
  [ 393.  594.  702.  810.  918. 1026. 1134. 1242.  753.]
  [ 474.  702.  810.  918. 1026. 1134. 1242. 1350.  816.]
  [ 555.  810.  918. 1026. 1134. 1242. 1350. 1458.  879.]
  [ 636.  918. 1026. 1134. 1242. 1350. 1458. 1566.  942.]
  [ 717. 1026. 1134. 1242. 1350. 1458. 1566. 1674. 1005.]
  [ 446.  627.  690.  753.  816.  879.  942. 1005.  590.]]] 

可以看到两个结果一致~

OK,通过两篇文章的介绍,相信对卷积的实现有很好的理解了。在理解的基础才能更好的去使用各种框架的封装接口。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,539评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,911评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,337评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,723评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,795评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,762评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,742评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,508评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,954评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,247评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,404评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,104评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,736评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,352评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,557评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,371评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,292评论 2 352

推荐阅读更多精彩内容