本文主要是介绍Alexnet输入大小227x227能否调整,kernel_size偶数有什么影响。,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
这篇博客对你有点用的话,记得给我点赞,我会更加乐于分享的。
前言
以下是我个人遇到的一些困惑,以及自己的理解和一些验证,稍微记录一下,仅供参考。
首先,我觉得,输入大小肯定是可以调的,只不过相应的每一层网络的参数都要做调整,调整后结果如何,没有验证,我这里验证只修改了输入size和输入层的一些参数,conv1之后的网络参数都不变。
我不要你觉得,我要我觉得,照我说的做..........
- Alexnet默认的输入227x227,最初关于224x224和227x227有过困惑,现在不困惑了,网络里面就是227x227,据说224x224可能是写paper时候的手误?还是后来对网络又做了调整?世纪之谜…
- 按我说的做,输入就用227x227。一般情况下用默认的227x227就行了,我也训练过自己的数据,也测试过,效果OK的。
- 但是,有些时候总想着能不能改变一下输入,但又不想全部每个层的参数都修改。所以就想着能不能只改一下输入层。于是在网上搜到这篇博客,也是这个思路,大家可以去看下,作者写的还是比较清晰易懂的,点个赞 。https://blog.csdn.net/ldsyou2015/article/details/60350556
- 我的目标是想把输入的size修改成偶数。但是按照公式来算的话,从输入 n x n到conv1层55x55x96。比如n x n=60x60,那么kernel_size就只能取偶数了。
引用
- 但是呢,kernel_size取偶数有很多弊端,就像知乎这里描述的一样https://www.zhihu.com/question/51603070。不过这些描述一般都是理论说一下偶数核的弊端,没有明说到底会造成多么严重的后果。所以还是想着自己验证一下。
- 我是用Alexnet做的二分类。
train_val.prototxt如下,输入改成60x60,stride 1,kernel_size 6。
比对一下,就是这几处修改一下,再重新训练模型。
deploy.prototxt输入修改成60x60,stride 1,kernel_size 6。
修改之后重新训练,得到caffemodel,然后自己写了测试代码,测试结果和输入227x227的做个比对:
从表格记录结果来看,输入修改成60x60,stride 1,kernel_size 6之后,得到的模型准确率可以认为完全不能用,当然也可能与输入分辨率下降有关,但不至于这么差。
我的测试代码也放在这里,对比测试时候其他都未改变,只是修改了caffemodel和deploy.prototxt两个文件。
#encoding=utf8
import sys
sys.path.append('./python')
sys.path.append('./python/caffe')import caffe
import numpy as np
import cv2
import argparseimport matplotlib.pyplot as pltcolor = {'common':'0', 'uniform':'1'}#root = '×××/caffe/'
caffe_model = './models/myAlexnet/myAlexnet_iter_60000.caffemodel'
deploy = './models/myAlexnet/deploy.prototxt'mean_file= './data/myAlexnet/myAlexnet_mean.npy' #mean.npy
def classifier(img, net):transformer = caffe.io.Transformer({'data': net.blobs['data'].data.shape})transformer.set_transpose('data', (2,0,1))transformer.set_mean('data', np.load(mean_file).mean(1).mean(1))
# transformer.set_raw_scale('data', 255)
# transformer.set_channel_swap('data', (2,1,0))net.blobs['data'].data[...]= transformer.preprocess('data',img)out = net.forward()prob = out['prob']print probreturn np.argmax(prob)if __name__ == '__main__':testList = open('./data/myAlexnet/test_0.txt', 'r')caffe.set_mode_gpu()caffe.set_device(0)net = caffe.Net(deploy, caffe_model, caffe.TEST)count = 0for line in testList: imagePath = line.split()[0] label = line.split()[1] path = './data/myAlexnet/test/'+imagePath img = cv2.imread(path)print 'path:'+path#plt.imshow(img)#plt.axis('on')#plt.show()result = classifier(img, net)print '-------------------------------'#plt.imshow(img)#plt.axis('off')#plt.show()print 'result:{}'.format(str(result))print 'label:{}'.format(str(label))print '-------------------------------'if result == int(label):count = count+1Precession = count*1.0/68 #test pic num.test_0=68,test_1=71,test_all=139print 'Precession is {}'.format(str(Precession))
最终,我要说的:
这个对比测试,我认为只是验证了在Alexnet目标分类时,kernel_size如果取偶数,训练的模型效果极差,几乎不能用。
没错,我认为是kernel_size的问题。
这篇关于Alexnet输入大小227x227能否调整,kernel_size偶数有什么影响。的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!