BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / ml-dm / #28326同步于 2018/2/27
该镜像源已超过 30 天没有更新,可能在源站已被删除。
ML_DM机器人发帖

为什么自己搭的Resnet在CIFAR-10上效果很差

Zelda
2018/2/27镜像同步21 回复
我用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
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
hyx0215机器人#1 · 2018/3/1
1、训练集能正常收敛证明网络结构是没问题的,没用cifar-10训过不过100%的正确率有点厉害了,网上查了一下cifar-10训练集好歹也是5万张图片。 2、判断是否过拟合不光是看最终的validation集上的准确率,还要看在validation集上的loss下降情况,个人认为如果是先上升再下降才能证明是出现了过拟合,否则不太像是典型的过拟合现象,更有可能是其它原因,比如算法本身的泛化性不够、训练集与测试集之间的分布出现较大不一致、任务本身比较困难以及一些调参相关的trick你没有用好等。建议你从检查训练数据开始做起。我用caffe多一些,记得tensorflow是需要自己手动设置正则化的?
Zelda机器人#2 · 2018/3/1
重新训练了一遍,画了个图,看样子应该就是过拟合了。原版的Resnet上是没有Dropout的,我比较纳闷的是为什么人家效果都那么好。 【 在 hyx0215 的大作中提到: 】 : 1、训练集能正常收敛证明网络结构是没问题的,没用cifar-10训过不过100%的正确率有点厉害了,网上查了一下cifar-10训练集好歹也是5万张图片。 : 2、判断是否过拟合不光是看最终的validation集上的准确率,还要看在validation集上的loss下降情况,个人认为如果是先上升再下降才能证明是出现了过拟合,否则不太像是典型的过拟合现象,更有可能是其它原因,比如算法本身的泛化性不够、训练集与测试集之间的分布出现较大不一致、任务本身比较困难以及一些调参相关的trick你没有用好等。建议你从检查训练数据开始做起。我用caffe多一些,记得tensorflow是需要自己手动设置正则化的?
hyx0215机器人#3 · 2018/3/2
【 在 Zelda 的大作中提到: 】 : 重新训练了一遍,画了个图,看样子应该就是过拟合了。原版的Resnet上是没有Dropout的,我比较纳闷的是为什么人家效果都那么好。 : 这个就不清楚了,可能是超参数设置的问题
szjh机器人#4 · 2018/3/2
【 在 Zelda 的大作中提到: 】 : 重新训练了一遍,画了个图,看样子应该就是过拟合了。原版的Resnet上是没有Dropout的,我比较纳闷的是为什么人家效果都那么好。 : 我没看见你的Dropout啊;如果你同时用了Dropout和BN,可能会出现一些问题。 https://arxiv.org/abs/1801.05134 这个文章之前溜过一次摘要,内容还没看,可能对你有帮助。
Viredery机器人#5 · 2018/3/2
训练参数是什么呀,按照论文上设置的?
Zelda机器人#6 · 2018/3/2
后来我在Idendity block的两个Conv layer中间加了Dropout 0.5,把网络缩减到十层,虽然还是过拟合,但val loss至少不会飞了,acc也有3%的提升。不过和论文差距还是很大,我还是怀疑是我的网络结构哪里弄错了。 【 在 szjh 的大作中提到: 】 : : 我没看见你的Dropout啊;如果你同时用了Dropout和BN,可能会出现一些问题。 : https://arxiv.org/abs/1801.05134 : ...................
Zelda机器人#7 · 2018/3/2
initializer是he_normal,regularizer是l2(1e-4)。 【 在 viredery 的大作中提到: 】 : 训练参数是什么呀,按照论文上设置的?
lyjtz机器人#8 · 2018/3/2
查一下你的Bn在测试时候是否用的是batch的mean和var,cifar上和imagenet不一样
jasonchi机器人#9 · 2018/3/2
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