您的位置:首页 > 理论基础 > 计算机网络

cnn 进阶 深度网络 new :卷积层可视化的思想实现 以及框架理解

2020-02-04 02:36 471 查看

数据可视化的 思想 ,就是要 分层 去看, 分了层 一层层 去看, 就看清楚了

简单的方法就是去 切片数据, 切了片, 就可以看了, 堆叠在一起的时候 是无法看清的

这个思想 下不用写复杂的函数, 直接 sess run tf 里面的参数就可以,
然后把想要可视化的参数 取出来 切片, imshow 或 matshow 就可以了
切片 就 这个意思 data[12,0,:,:] , :: 就是你要查看的那一层 的数值 , 剩下两个参数 是定位到具体的 层 或批次的

此外, 我构建了 常量矩阵, 看看卷积是如何运算了 ,看完也算明白了
输入层 和 卷积层要 一样 的 ch 通道, 或者叫深度 厚度 什么的
为什么要一样的, 应为 要层层(通道 深度)对应的去窗口滑动 求知, 最后 加和到一个层面上

三通道 对应三通道 每个通道上的 那一层 相乘 , 然后三层求和 就是75 , 3 层最后变成了 1层 ,一个通道了

#这就是传说中的 数据降维度了。。 降维度打击。。。,属性叠合在一起了
#卷积 就是 乘法 和 加法 ,窗口移动的加法

import pickleimport numpy as npimport tensorflow as tfsess =tf.Session()
#定义一个读取文件的函数, 把里面的 data 和 labels读出来def load_CIFAR_batch(filename):""" load single batch of cifar """with open(filename, "rb")as f:datadict = pickle.load(f,encoding="iso-8859-1")X = datadict["data"]Y = datadict["labels"]X = X.reshape(10000, 3, 32, 32)Y = np.array(Y)return X, Y
#上面函数 就说了 是返回X Y  分别代表 data 和 labels , 导入一个batch1 玩玩看X ,Y = load_CIFAR_batch(\"C:/Users/admin/Desktop/cifar-10-python/cifar-10-batches-py/data_batch_1")#\有链接代码的作用, 所以路径都要换成/  , 第二行的\  就起到了链接的下一行的作用
print(X.shape)print(X[0,0].shape)print(Y.shape)pylab.imshow(X[12,0,:,:])  #的第一个图层pylab.show()
(10000, 3, 32, 32)(32, 32)(10000,)

[外链图片转存失败(img-yt9mIwQx-1568784060928)(output_3_1.png)]

#修理下X的 数据格式  ,数据“放到 ”tf 下了#多次运行 就会发生问题。。。  被来回换位置#X = tf.reshape(X, [-1, 3, 32, 32])#X = tf.transpose(X, [0, 2, 3, 1])#print(sess.run(X[0]))print(X.shape)
(10000, 3, 32, 32)
from PIL import Image #导入这个模块可视化一下import pylab
X12  = X[12]  #看下马r = Image.fromarray(X12[0])g = Image.fromarray(X12[1])b = Image.fromarray(X12[2])X12_m = Image.merge("RGB",(r,g,b))pylab.imshow(X12_m)pylab.show()

[外链图片转存失败(img-ljVLo3iR-1568784060929)(output_6_0.png)]

#为了满足卷积层 格式需要#Given an input tensor of shape `[batch, in_height, in_width, in_channels]`#H W在中间,  通道在最后X = tf.transpose(X, [0, 2, 3, 1])print(X.shape)print(X[0].shape)print(X[12,:,:,0])pylab.imshow(sess.run(X[12,:,:,0]))  #切片显示pylab.show()print(sess.run(tf.size(X[0])))  #3072   32*32 *3##各种转换,  是需要可视化一下,,,下面的图, 不然很容易出错#转置来转置去, 图像不会颠倒或反转, 这就是转置的限制吧 。那其他形式变换矩阵 。。。
(10000, 32, 32, 3)(32, 32, 3)Tensor("strided_slice_1:0", shape=(32, 32), dtype=uint8)

[外链图片转存失败(img-MSTF42yf-1568784060931)(output_7_1.png)]

3072
#X12  = X[12]  #看下马  ,马的 看不了了, 放到 tf里了X12  = sess.run(X[12])  #X12    ,3个 32*32的矩阵r = Image.fromarray(X12[0])g = Image.fromarray(X12[1])b = Image.fromarray(X12[2])X12_m = Image.merge("RGB",(r,g,b))pylab.imshow(X12_m)pylab.show()#这里没办法, 位置变了, Image无法读取这种格式 (位置变了, 参数要改)

[外链图片转存失败(img-KdCrP0MS-1568784060932)(output_8_0.png)]

#卷一层玩玩看#看下原函数, 贼复杂, 滤波器参数5*5*3, 32个X = tf.cast(X, tf.float32)filter1 = tf.truncated_normal([5,5,3,64], stddev = 0.1)#搞32个随机的 5*5,3 ch 通道(32核心)矩阵X1 = tf.truncated_normal([100,32,32,3], stddev = 0.1)#C1 = tf.nn.conv2d(input=X,filter=filter1,strides=[1, 1, 1, 1], padding = "SAME" )C1 = tf.nn.conv2d(input=X1,filter=filter1,strides=[1, 1, 1, 1], padding = "SAME" )#Pool1 =tf.nn.max_pool(X, ksize = [1, 2, 2, 1],strides = [1, 2, 2, 1],padding = "SAME")#print(sess.run(X).shape)print(sess.run(X1).shape)print(sess.run(filter1).shape)print(sess.run(C1).shape)#pylab.matshow(sess.run(X1[0,:,:,0]))#,cmap="gray")  #切片显示  /matshow  or  imshow  都可以。。。#pylab.show()#pylab.matshow(sess.run(filter1[:,:,0,0]))#,cmap="gray" )  #切片显示#pylab.show()#pylab.matshow(sess.run(C1[0,:,:,0]))#,cmap="gray" )  #切片显示#pylab.show()fig = pylab.figure()ax = fig.add_subplot(131)ax.matshow(sess.run(X1[0,:,:,0]))ax = fig.add_subplot(132)ax.matshow(sess.run(filter1[:,:,0,0]))ax = fig.add_subplot(133)ax.matshow(sess.run(C1[0,:,:,0]))pylab.show()#  数据可视化的 思想 ,就是要 分层 去看, 分了层 一层层 去看, 就看清楚了#  简单的方法就是去  切片数据, 切了片, 就可以看了, 堆叠在一起的时候 是无法看清的#print(sess.run(filter1[0]))# 32*32 -  filter 5*5  步幅1  输出为什么不是28*28?  [32-5 + 2*PADDING(2)]/ STRIDES +1# WHEN  filter 3*3 padding =1   5*5   2  、  7*7  padding3# 先padding数计算出来 , 乘2  ,加上输入矩阵  减去
(100, 32, 32, 3)(5, 5, 3, 64)(100, 32, 32, 64)

[外链图片转存失败(img-B5Hz64xh-1568784060934)(output_9_1.png)]

? tf.nn.conv2d
import matplotlib.pyplot as plt#help(plt)
X2 = tf.constant(1.,shape=[100,32,32,3])print(sess.run(X2[0,:2,:,1]))filter2 = tf.constant(1.,shape=[5,5,3,64])print(sess.run(filter2[:,:,0,0]))
[[1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.1. 1. 1. 1. 1. 1. 1. 1.][1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.1. 1. 1. 1. 1. 1. 1. 1.]][[1. 1. 1. 1. 1.][1. 1. 1. 1. 1.][1. 1. 1. 1. 1.][1. 1. 1. 1. 1.][1. 1. 1. 1. 1.]]
C2 = tf.nn.conv2d(input=X2,filter=filter2,strides=[1, 1, 1, 1], padding = "VALID" )  #VALIDprint(sess.run(C2).shape)
(100, 28, 28, 64)
print(sess.run(C2[0,:5,:,2]))# 三通道 对应三通道  每个通道上的 那一层 相乘 , 然后三层求和  就是75   3 层最后变成了 1层 ,64个一通道的了#这就是传说中的 数据降维度了。。 降维度打击。。。,属性叠合在一起了#卷积 就是 乘法 和 加法  ,窗口移动的加法
[[75. 75. 75. 75. 75. 75. 75. 75. 75. 75. 75. 75. 75. 75. 75. 75. 75. 75.75. 75. 75. 75. 75. 75. 75. 75. 75. 75.][75. 75. 75. 75. 75. 75. 75. 75. 75. 75. 75. 75. 75. 75. 75. 75. 75. 75.75. 75. 75. 75. 75. 75. 75. 75. 75. 75.][75. 75. 75. 75. 75. 75. 75. 75. 75. 75. 75. 75. 75. 75. 75. 75. 75. 75.75. 75. 75. 75. 75. 75. 75. 75. 75. 75.][75. 75. 75. 75. 75. 75. 75. 75. 75. 75. 75. 75. 75. 75. 75. 75. 75. 75.75. 75. 75. 75. 75. 75. 75. 75. 75. 75.][75. 75. 75. 75. 75. 75. 75. 75. 75. 75. 75. 75. 75. 75. 75. 75. 75. 75.75. 75. 75. 75. 75. 75. 75. 75. 75. 75.]]
  • 点赞
  • 收藏
  • 分享
  • 文章举报
yongaifadian发布了21 篇原创文章 · 获赞 0 · 访问量 1037私信关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: