Caffe网络结构可视化、特征图可视化、学习曲线可视化

一、网络结构可视化                                                                                                                     点击此处返回总目录

二、特征图可视化

三、训练Loss和准确率可视化

 

 

 

 

一、网络结构可视化

使用到caffe-windows\python下的draw_net.py这个文件。有两种方法。第二种方法要,就不讲了。

    Caffe网络结构可视化、特征图可视化、学习曲线可视化_第1张图片

 

【实践】

1. 在caffe-windows\examples\mnist下新建draw_net文件夹,用于存放一会生成的图片。

2. 执行命令。

     Caffe网络结构可视化、特征图可视化、学习曲线可视化_第2张图片

     //可能遇到"dot not found in path"的问题。我输入"conda install pydot"解决了。

     Caffe网络结构可视化、特征图可视化、学习曲线可视化_第3张图片

 

     命令执行成功后,draw_net下可以看到mnist_tb.png图片。

                                                               Caffe网络结构可视化、特征图可视化、学习曲线可视化_第4张图片

                                                                

同样参数BT生成:

                                                               Caffe网络结构可视化、特征图可视化、学习曲线可视化_第5张图片

使用参数LR生成:

 

 

 

 

二、特征图可视化

要看一下经过卷积和池化以后得到的特征图,对这些特征图可视化,就能更好的理解卷积和池化的操作。

 

1. 将F:\deep_learning\Caffe\caffe-windows\examples\mnist下的网络结构文件lenet.prototxt复制一份为lenet_2.prototxt。

    修改lenet_2.prototxt:将输入图片的维度改为1,1,28,28。第一个1表示一次输入一张图片。第二个1表示图片是黑白的,如果是彩色的则为3.

                    Caffe网络结构可视化、特征图可视化、学习曲线可视化_第6张图片

2. 在F:\deep_learning\Caffe\caffe-windows\examples\mnist下新建文件夹draw_data,用于存放这些特征图。

3. 编写特征图初始化的程序

 

//特征图可视化

# coding: utf-8

import numpy as np
import matplotlib.pyplot as plt
from PIL import Image
import os
import sys
import caffe


#网络结构描述文件
deploy_file = "F:/deep_learning/Caffe/caffe-windows/examples/mnist/lenet.prototxt"
#模型文件
model_file  = "F:/deep_learning/Caffe/caffe-windows/examples/mnist/models_iter_10000.caffemodel"
#测试图片
test_data   = "F:/deep_learning/Caffe/caffe-windows/examples/mnist/MNIST_data/0-9/8.bmp"
#特征图路径
feature_map_path = "F:/deep_learning/Caffe/caffe-windows/examples/mnist/draw_data/"

#编写一个函数,用于显示各层的参数,padsize用于设置图片间隔空隙,padval用于调整亮度 
def show_data(data, name, padsize=1, padval=0):
    
    #归一化。归一化到0-1之间。
    data -= data.min()
    data /= data.max()
    
    #根据data中图片数量data.shape[0],计算最后输出时每行每列图片数n
    n = int(np.ceil(np.sqrt(data.shape[0])))     #20开根号得到4点多,ceil()得到5.
    
    # 对于conv1,data.shape->(20,24,24)
    # padding=((前面填补0个,后面填补n**2-data.shape[0]),(前面填补0个,后面填补padsize个),(前面填补0个,后面填补padsize个)
    padding = ((0, n ** 2 - data.shape[0]), (0, padsize), (0, padsize))
    data = np.pad(data, padding, mode='constant', constant_values=padval)#常数值填充,填充0
    
    # 对于conv1,padding后data.shape->(25,25,25)。原来是20,现在是25;原来的图片是24*24,现在是25*25
    # 对于conv1,将(25,25,25)reshape->(5,5,25,25)再transpose->(5,25,5,25)
    data = data.reshape((n, n) + data.shape[1:]).transpose((0, 2, 1, 3))
    
    # 再将(n, W, n, H)变换成(n*w, n*H)
    data = data.reshape((n * data.shape[1], n * data.shape[3]))
    

    image_path = os.path.join(feature_map_path,name)#特征图路径
    plt.set_cmap('gray')#设置为灰度图
    plt.imsave(image_path,data)#保存生成的图片
    plt.axis('off')#不显示坐标
    
    print name
    #显示图片
    img=Image.open(image_path)
    plt.imshow(img)
    plt.show()


#----------------------------数据预处理---------------------------------
#初始化caffe.调用.Net()函数。出入三个参数。
net = caffe.Net(deploy_file, #网络结构描述文件 
                model_file,  #训练好的模型
                caffe.TEST)  #使用测试模式

#输出网络每一层的参数。
print [(k, v[0].data.shape) for k, v in net.params.items()]

#定义了数据的预处理。一般就这样定义。
transformer = caffe.io.Transformer({'data': net.blobs['data'].data.shape}) 

# python读取的图片文件格式为H×W×K(高度,宽度,通道数),需转化为K×H×W(通道数,高度,宽度)。caffe中需要这样转换。
transformer.set_transpose('data', (2, 0, 1))

# python中将图片存储为[0-1]
# 如果模型输入用的是0~255的原始格式,则需要做以下转换。python读入的数据是0-1之间的,所以不需要转换。(liupc:存疑)
# transformer.set_raw_scale('data', 255)

# caffe中图片是BGR格式,而原始格式是RGB,所以要转化。这里是黑白图片,所以不需要转换。
#transformer.set_channel_swap('data', (2, 1, 0))


#----------------------------数据运算---------------------------------
#读取图片
#参数color: True(default)是彩色图,False是灰度图
img = caffe.io.load_image(test_data,color=False)

# 数据输入、预处理
net.blobs['data'].data[...] = transformer.preprocess('data', img)

# 将输入图片格式转化为合适格式(与deploy文件相同)
net.blobs['data'].reshape(1, 1, 28, 28)

# 前向迭代,即分类。保存输出
out = net.forward()

# 输出结果为各个可能分类的概率分布
print "Prob:"
print out['prob']

#最可能分类
predict = out['prob'].argmax()
print "Result:" + str(predict)

#----------------------------输出特征图---------------------------------
#第一个卷积层输出的特征图
#20指第一个卷积层有20个卷积核,输出20个特征平面。得到了20个24*24的特征平面。特征平面的图像保存为conv1.jpg
feature = net.blobs['conv1'].data
show_data(feature.reshape(20,24,24),'conv1.jpg')        
#第一个池化层输出的特征图
#池化后还是20个特征平面。
feature = net.blobs['pool1'].data
show_data(feature.reshape(20,12,12),'pool1.jpg')
#第二个卷积层输出的特征图
feature = net.blobs['conv2'].data
show_data(feature.reshape(50,8,8),'conv2.jpg')
#第二个池化层输出的特征图
feature = net.blobs['pool2'].data
show_data(feature.reshape(50,4,4),'pool2.jpg')

 

运行结果:

[('conv1', (20L, 1L, 5L, 5L)), ('conv2', (50L, 20L, 5L, 5L)), ('ip1', (500L, 800L)), ('ip2', (10L, 500L))]
D:\Anaconda3\envs\py2\lib\site-packages\skimage\io\_io.py:49: UserWarning: `as_grey` has been deprecated in favor of `as_gray`
  warn('`as_grey` has been deprecated in favor of `as_gray`')
Prob:
[[5.0160093e-12 1.0941860e-10 7.1815845e-07 8.5310762e-07 4.4245128e-11
  2.4811045e-10 1.2400418e-12 2.5765683e-09 9.9999845e-01 1.5572809e-09]]
Result:8
conv1.jpg

Caffe网络结构可视化、特征图可视化、学习曲线可视化_第7张图片

pool1.jpg


conv2.jpg


pool2.jpg

 

可以到caffe-windows\examples\mnist\draw_data下面查看,生成了特征图。

 

 

 

 

 

 

三、对训练loss和准确率进行可视化

1. 到caffe-windows\tools\extra下面,将plot_training_log.py.example改名为plot_training_log.py。这用于输出可视化图片。

输入python F:\deep_learning\Caffe\caffe-windows\tools\extra\plot_training_log.py可以看到用法提示:

第一个参数0-7意义如下,比如0代表准确率和迭代次数,1代表准确率和时间等等。

                  Caffe网络结构可视化、特征图可视化、学习曲线可视化_第8张图片

 

第二个参数:是图片的保存路径。

第三个参数:log。

 

2. 在caffe-windows\examples\mnist下新建mnist_acc文件夹,用于存放图片。

3. 修改或编写caffe-windows\examples\mnist\bat下的train.bat。将Debug改为Release,(因为这样训练的快很多)。

    然后增加2>>mnist.log,这样就有日志文件了。

    执行结束后,生成了mnist.log文件。

4. 执行命令。

python F:\deep_learning\Caffe\caffe-windows\tools\extra\plot_training_log.py 0 F:\deep_learning\Caffe\caffe-windows\examples\mnist\mnist_acc\acc_iters.png  F:\deep_learning\Caffe\caffe-windows\examples\mnist\bat\mnist.log

 

我跑这个代码的时候出现问题,应该是plot_training_log.py这个程序有问题。

                       Caffe网络结构可视化、特征图可视化、学习曲线可视化_第9张图片

我又从网上找了一个代码:

https://download.csdn.net/download/sunshine_in_moon/9706954

使用这个代码的plot_training_log.py(开头需要加一句"#coding:utf-8"),就可以正确画图了。

 

执行:

结果:

                                        Caffe网络结构可视化、特征图可视化、学习曲线可视化_第10张图片

 

执行:

结果:

                              Caffe网络结构可视化、特征图可视化、学习曲线可视化_第11张图片

 

可以在caffe-windows\examples\mnist\mnist_acc\下面看到绘制的图形。

 

 

 

 

 

 

你可能感兴趣的:(17,深度学习)