本文承接上篇对ResNet的分析与复现:Deep Residual Network学习(一)
通过上次在Cifar10上复现ResNet的结果,我们得到了上表,最后一栏是论文中的结果,可以看到已经最好的初始化方法(MSRA)已经和论文中的结果非常接近了!今天我们完全按照论文中的实验环境,复现一下ResNet论文中的结果。
上次的论文复现主要和原文中有两点不同:
1.Data Augmentation
Cifar10中的图像都是32X32的,论文中对测试集中的每张图在每边都扩展了4个像素,得到40X40的图像,在训练时随机crop出32X32的图像进行训练,而对测试集不做任何操作
import lmdb
import cv2
import caffe
from caffe.proto import caffe_pb2
env1=lmdb.open('cifar10_train_lmdb')
txn1=env1.begin()
cursor=txn1.cursor()
datum=caffe_pb2.Datum()
env2=lmdb.open('cifar10_pad4_train_lmdb',map_size=50000*1000*10)
txn2=env2.begin(write=True)
count=0
for key,value in cursor:
datum.ParseFromString(value)
label=datum.label
data=caffe.io.datum_to_array(datum)
img=data.transpose(1,2,0)
pad=cv2.copyMakeBorder(img,4,4,4,4,cv2.BORDER_REFLECT)
array=pad.transpose(2,0,1)
datum1=caffe.io.array_to_datum(array,label)
str_id='{:08}'.format(count)
txn2.put(str_id,datum1.SerializeToString())
count+=1
if count%1000 ==0:
print('already handled with {} pictures'.format(count))
txn2.commit()
txn2=env2.begin(write=True)
txn2.commit()
env2.close()
env1.close()
程序很容易理解,最关键的是这句:
pad=cv2.copyMakeBorder(img,4,4,4,4,cv2.BORDER_REFLECT)
使用cv2的makeBorder函数扩展4个像素,运行后本地就会得到cifar10_pad4_train_lmdb了,注意,均值文件也需要重新生成,用于训练集数据