返回信息流我用Keras(TF backend)根据1512.03385这篇论文搭了一个Resnet-18,在CIFAR-10上过拟合很严重,在训练集上acc很快就达到100%了,而validation的loss一直都不下降,acc也只能到80%。我看网上任何文章都说自己用原始的Resnet-18跑CIFAR-10都可以达到90%以上。是我的model有问题?
def identity_block(x,filters, is_first=False):
stride = (1, 1) if not is_first else (2, 2)
y = Convolution2D(filters, 3, strides=stride, padding='same')(x)
y = BatchNormalization()(y)
y = Activation('relu')(y)
y = Convolution2D(filters, 3, strides=(1, 1), padding='same')(y)
y = BatchNormalization()(y)
shortcut = x
if is_first:
shortcut = Convolution2D(filters, 1, strides=stride)(shortcut)
shortcut = BatchNormalization()(shortcut)
y = merge([y, shortcut], mode='sum')
y = Activation('relu')(y)
return y
def build_resnet_model(input_shape):
inp = Input(shape=input_shape)
out = Convolution2D(64,7,strides=(2,2),padding='same')(inp)
out = BatchNormalization()(out)
out = Activation('relu')(out)
out = MaxPooling2D((3,3),strides=(2,2))(out)
out = identity_block(out, 64, False)
out = identity_block(out, 64, False)
out = identity_block(out, 128, True)
out = identity_block(out, 128, False)
out = identity_block(out, 256, True)
out = identity_block(out, 256, False)
out = identity_block(out, 512, True)
out = identity_block(out, 512, False)
#out = AveragePooling2D((2, 2))(out)
out = Flatten()(out)
out = Dense(10, activation='softmax')(out)
model = Model(inp, out)
return model
这是一条镜像帖。来源:北邮人论坛 / ml-dm / #28326同步于 2018/2/27
该镜像源已超过 30 天没有更新,可能在源站已被删除。
ML_DM机器人发帖
为什么自己搭的Resnet在CIFAR-10上效果很差
Zelda
2018/2/27镜像同步21 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
1、训练集能正常收敛证明网络结构是没问题的,没用cifar-10训过不过100%的正确率有点厉害了,网上查了一下cifar-10训练集好歹也是5万张图片。
2、判断是否过拟合不光是看最终的validation集上的准确率,还要看在validation集上的loss下降情况,个人认为如果是先上升再下降才能证明是出现了过拟合,否则不太像是典型的过拟合现象,更有可能是其它原因,比如算法本身的泛化性不够、训练集与测试集之间的分布出现较大不一致、任务本身比较困难以及一些调参相关的trick你没有用好等。建议你从检查训练数据开始做起。我用caffe多一些,记得tensorflow是需要自己手动设置正则化的?
重新训练了一遍,画了个图,看样子应该就是过拟合了。原版的Resnet上是没有Dropout的,我比较纳闷的是为什么人家效果都那么好。
【 在 hyx0215 的大作中提到: 】
: 1、训练集能正常收敛证明网络结构是没问题的,没用cifar-10训过不过100%的正确率有点厉害了,网上查了一下cifar-10训练集好歹也是5万张图片。
: 2、判断是否过拟合不光是看最终的validation集上的准确率,还要看在validation集上的loss下降情况,个人认为如果是先上升再下降才能证明是出现了过拟合,否则不太像是典型的过拟合现象,更有可能是其它原因,比如算法本身的泛化性不够、训练集与测试集之间的分布出现较大不一致、任务本身比较困难以及一些调参相关的trick你没有用好等。建议你从检查训练数据开始做起。我用caffe多一些,记得tensorflow是需要自己手动设置正则化的?
【 在 Zelda 的大作中提到: 】
: 重新训练了一遍,画了个图,看样子应该就是过拟合了。原版的Resnet上是没有Dropout的,我比较纳闷的是为什么人家效果都那么好。
:
这个就不清楚了,可能是超参数设置的问题
【 在 Zelda 的大作中提到: 】
: 重新训练了一遍,画了个图,看样子应该就是过拟合了。原版的Resnet上是没有Dropout的,我比较纳闷的是为什么人家效果都那么好。
:
我没看见你的Dropout啊;如果你同时用了Dropout和BN,可能会出现一些问题。
https://arxiv.org/abs/1801.05134
这个文章之前溜过一次摘要,内容还没看,可能对你有帮助。
后来我在Idendity block的两个Conv layer中间加了Dropout 0.5,把网络缩减到十层,虽然还是过拟合,但val loss至少不会飞了,acc也有3%的提升。不过和论文差距还是很大,我还是怀疑是我的网络结构哪里弄错了。
【 在 szjh 的大作中提到: 】
:
: 我没看见你的Dropout啊;如果你同时用了Dropout和BN,可能会出现一些问题。
: https://arxiv.org/abs/1801.05134
: ...................
initializer是he_normal,regularizer是l2(1e-4)。
【 在 viredery 的大作中提到: 】
: 训练参数是什么呀,按照论文上设置的?
def build_resnet_model(input_shape):
inp = Input(shape=input_shape)
out = Convolution2D(64,3,strides=(1,1),padding='same')(inp) #32*32*64
out = BatchNormalization()(out)
out = Activation('relu')(out)
out = MaxPooling2D((3,3),strides=(2,2))(out) #16*16*64
out = identity_block(out, 64, False)
out = identity_block(out, 64, False)
out = identity_block(out, 128, True) #8*8*128
out = identity_block(out, 128, False)
out = identity_block(out, 256, True) #4*4*256
out = identity_block(out, 256, False)
out = identity_block(out, 512, True) #2*2*512
out = identity_block(out, 512, False)
out = AveragePooling2D((2, 2))(out)
out = Flatten()(out)
out = Dense(10, activation='softmax')(out)
model = Model(inp, out)
return model