DRML(2016-CVPR)重现过程记录---(5)问题定位_1

大师姐的建议:
1,把自己生成好的模型参数打印出来,并查看数字是否有异常;
2,重新阅读文章,把逻辑关系理清楚,再对代码进行调试查看。

感谢张君鹏同学教我怎么打印模型参数,大晚上的帮我看代码,加快了问题定位的进度。

solver.prototxt的最后增加debug_info: true,使之打印出训练时具体的数据信息。


不知道这里是否有异常,看不懂。


编译pycaffe:进入caffe根目录,make pycaffe -j8


编写python脚本打印网络参数和网络层之间传递的数据,代码如下:


import numpy as np
import matplotlib.pyplot as plt
import sys,os
import cv2

sys.path[0]='/home/hqp/DRML/caffe-DRML/caffe/python'
import caffe

caffemodel='/home/hqp/DRML/models/noglobal_stats_iter/DRMLno_use_global_stats_iter_6000.caffemodel'
prototxt='/home/hqp/DRML/prototxt/nofalseuse_global_stats/deploy_test.prototxt'
testimg='/home/hqp/DRML/face/SN001_0001.jpg'
if not os.path.isfile(caffemodel):
  print("caffemodel is not exist...")

caffe.set_mode_gpu()
net = caffe.Net(prototxt, caffemodel, caffe.TEST)
cvimg=cv2.imread(testimg)
resized_cvimg = cv2.resize(cvimg, (170, 170)) 

resized_cvimg=(resized_cvimg-127.5)

net.blobs['data'].data[0] = np.transpose(resized_cvimg,(2,0,1))

print dir(net)


for layer in  net.layers:
    print dir(layer)
    print layer.type
    for blob in layer.blobs:
        print blob.data.shape
        print blob.data

for blob in net.blobs:
    print blob
    print net._blobs_dict[blob].data.shape
    print net._blobs_dict[blob].data



out = net.forward()

result = out['fc8']

print result




运行: sudo python  pycaffe_print.py  2>&1 | tee print.log


把结果输出到log中。部分log信息如下:


前面打印了网络参数,没有明显的全0或者重复数字的特殊情况,看不出有什么问题。后面打印了网络层之间传递的数据,看上去只有输入层有数据,第一个conv层就已经是全0了,所以才会导致最终的输出与输入图片无关的奇怪现象。

20170504

/**************************************************************************************************************************************/

20170505

今天查看已有网络发现之前写的python脚本打印参数写错了,用之前的python脚本,即使是打印已经公布的alexnet也有相同的问题出现。

参考http://lijiancheng0614.github.io/2015/08/21/2015_08_21_CAFFE_Features/

重新写了python打印参数的脚本,如下图:

import numpy as np
import matplotlib.pyplot as plt
import sys,os
import cv2

sys.path[0]='/home/hqp/DRML/caffe-DRML/caffe/python'
import caffe

caffemodel='/home/hqp/DRML/models/noglobal_stats_iter/DRMLno_use_global_stats_iter_6000.caffemodel'
prototxt='/home/hqp/DRML/prototxt/nofalseuse_global_stats/deploy_test.prototxt'
testimg='/home/hqp/DRML/face/SN001_0001.jpg'

#caffemodel='/home/hqp/DRML/caffe-DRML/caffe/models/bvlc_alexnet/bvlc_alexnet.caffemodel'
#prototxt='/home/hqp/DRML/caffe-DRML/caffe/models/bvlc_alexnet/deploy.prototxt'
#testimg='/home/hqp/DRML/caffe-DRML/caffe/examples/images/cat.jpg'

if not os.path.isfile(caffemodel):
  print("caffemodel is not exist...")

caffe.set_mode_gpu()
net = caffe.Net(prototxt, caffemodel, caffe.TEST)
transformer = caffe.io.Transformer({'data': net.blobs['data'].data.shape})
transformer.set_transpose('data', (2,0,1))
transformer.set_raw_scale('data', 255)
transformer.set_channel_swap('data', (2,1,0))
net.blobs['data'].reshape(1,3,170,170)
net.blobs['data'].data[...] = transformer.preprocess('data', caffe.io.load_image(testimg))
out = net.forward()


print dir(net)


for blob in net.blobs:
    print blob
    print net._blobs_dict[blob].data.shape
    print net._blobs_dict[blob].data



out = net.forward()

result = out['fc8']

print result




现在可以看到结果,测试一张图,其打印出来的conv1数据非0,但是所有的batchnorm层的blob都是0,而在之后的relu层等又开始非0,也就是说,输入数据的作用是从batchnorm这个层断掉的。如下图所示




但是我查看了之前错误版本的python取网络层参数和数据的输出log文件,发现在输入错误的情况下,从conv1开始blob全部是0,即使在全0的batchnorm层之后,relu也全部是0.所以这里出现batchnorm层全0 而后面的relu层非0的情况,我还不确定是正常还是不正常,我需要对这些网络层的意义进一步了解。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值