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

xiaoxiao2021-02-27  175

大师姐的建议: 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的情况,我还不确定是正常还是不正常,我需要对这些网络层的意义进一步了解。

转载请注明原文地址: https://www.6miu.com/read-12381.html

最新回复(0)