Alexnet输入大小227x227能否调整,kernel_size偶数有什么影响。

这篇博客对你有点用的话,记得给我点赞,我会更加乐于分享的。

前言

以下是我个人遇到的一些困惑,以及自己的理解和一些验证,稍微记录一下,仅供参考。
首先,我觉得,输入大小肯定是可以调的,只不过相应的每一层网络的参数都要做调整,调整后结果如何,没有验证,我这里验证只修改了输入size和输入层的一些参数,conv1之后的网络参数都不变。

我不要你觉得,我要我觉得,照我说的做..........
  1. Alexnet默认的输入227x227,最初关于224x224和227x227有过困惑,现在不困惑了,网络里面就是227x227,据说224x224可能是写paper时候的手误?还是后来对网络又做了调整?世纪之谜…
  2. 按我说的做,输入就用227x227。一般情况下用默认的227x227就行了,我也训练过自己的数据,也测试过,效果OK的。
  3. 但是,有些时候总想着能不能改变一下输入,但又不想全部每个层的参数都修改。所以就想着能不能只改一下输入层。于是在网上搜到这篇博客,也是这个思路,大家可以去看下,作者写的还是比较清晰易懂的,点个赞 。https://blog.csdn.net/ldsyou2015/article/details/60350556
  4. 我的目标是想把输入的size修改成偶数。但是按照公式来算的话,从输入 n x n到conv1层55x55x96。比如n x n=60x60,那么kernel_size就只能取偶数了。

引用
在这里插入图片描述

  1. 但是呢,kernel_size取偶数有很多弊端,就像知乎这里描述的一样https://www.zhihu.com/question/51603070。不过这些描述一般都是理论说一下偶数核的弊端,没有明说到底会造成多么严重的后果。所以还是想着自己验证一下。
  2. 我是用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 argparse

import matplotlib.pyplot as plt

color = {'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 prob
    return 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 = 0
    for 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+1
    Precession = count*1.0/68     #test pic num.test_0=68,test_1=71,test_all=139
    print 'Precession is {}'.format(str(Precession))

最终,我要说的:
这个对比测试,我认为只是验证了在Alexnet目标分类时,kernel_size如果取偶数,训练的模型效果极差,几乎不能用。
没错,我认为是kernel_size的问题。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值