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

本文介绍了数据可视化的思想,强调通过分层观察来理解卷积神经网络(CNN)的工作原理。通过切片数据,逐层查看,展示了如何直观地理解卷积层的操作。内容包括三通道的对应关系,以及卷积过程中的乘法和加法操作,解释了为何输入层和卷积层需要相同通道数的原因,并探讨了数据降维的概念。
摘要由CSDN通过智能技术生成

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

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

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

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

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

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


import pickle
import numpy as np
import tensorflow as tf
sess =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" )  #VALID
print(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.]]

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值