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