【随便整点深度学习01】看看神经网络每层提取了什么?

前言?

因为毕设是关于深度学习的,于是从年初开始就断断续续的接触了许多相关的知识。不过到现在也没几个月的时间,还是一个萌萌萌萌萌萌萌新~~写点博客记录一下遇到的并且以后可能会忘记的问题,估计在大佬们看来应该只是非常熟悉的东西了。想到啥写啥,就不弄目录了;如果其中有什么错误,欢迎指出!


在学习卷积神经网络时,我还顺便了解了一些图像特征提取的知识。这些特征,我们都可以用 opencv 或 skimage.feature 中写好的函数去提取,再或者自己写个函数也可以。而且,我们可以看到这些特征提取完是个啥样子的:

img = loadImgPath(trainPath[0])
img = np.reshape(img, (181,143))
lbp = skft.local_binary_pattern(img,8,1,'default') # 此函数进行LBP特征提取
plt.imshow(lbp,cmap='gray')

  << 原图           <<LBP

 那一个模型中那么多卷积层,卷积层也是提取特征用的,我要怎么才能看到一张图片经过了某一个或几个卷积层之后会变成什么样子呢?

正好最近还看到了一个论文,说什么可以把一张图放到几个不同的模型中提取特征,然后再把得到的这些特征融合在一起,接着往后进行训练。唔,看着就很玄学,不过我还时想知道这些经过模型提取出的特征是长啥样的(虽然对我来说好像没什么用)。


废话辣么多,那么来说说具体的办法吧!

先搞到一张图片(loadImgPath函数长啥样不重要):

img2 = loadImgPath(trainPath[7])
plt.imshow(img2)

再搞到一个模型(直接用训练好的VGG16了,当然用自己的模型也可以):

conv_base = tf.keras.applications.VGG16(include_top=False, weights='imagenet')
conv_base.summary()

 看到前面的layer的name了吗,就用这个name选择你想查看的位置:

model = tf.keras.Model(inputs=conv_base.input, outputs=conv_base.get_layer('block1_conv1').output)

得到features:

img2 = np.expand_dims(img2, axis=0) # 我用的这个VGG16需要一个四维的向量(图片数量,宽度,高度,通道数)进行输入,所以扩展一下维度
features2 = model.predict(img2)

查看一下features的shape:

features2 = features2[0] # 同样得到的feature也是四维的(图片数量,宽度,高度,通道数),我们只有一张图片,把第一维去掉就好了
features2.shape

 每个通道上是一个特征图,但不巧的是通道数是最后一维,我也没有找到倒着取的办法,所以需要做一点小小的转换:

features2 = np.transpose(features2,(2,1,0)) # 用transpose函数交换两个维度
features2.shape

 

 现在就可以查看每个通道上的特征图了,不过宽高是反着的,记得加上一个转置:

plt.imshow(features2[0].T,cmap='gray') # 提取的特征(好像是边缘?

痛苦面具.jpg

plt.imshow(features2[44].T,cmap='gray')

 

 当然越靠后的层提取的东西也会越抽象,比如这个(???):


总结

没有总结,欸嘿 ( ̄o ̄) . z Z

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值