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