数据可视化的 思想 ,就是要 分层 去看, 分了层 一层层 去看, 就看清楚了
简单的方法就是去 切片数据, 切了片, 就可以看了, 堆叠在一起的时候 是无法看清的
这个思想 下不用写复杂的函数, 直接 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.]]