ResNet:训练期间的准确率为100%,但使用相同数据的预测准确率为33%

时间:2017-11-07 12:03:24

标签: machine-learning deep-learning keras

我是机器学习和深度学习的新手,为了学习目的,我尝试使用Resnet。我试图过度填充小数据(3 不同的图像),看看我是否能得到几乎0的损失和1.0的准确度 - 我做到了。

问题在于训练图像的预测(即用于训练的3张图像)不正确。

培训图片

image 1 image 2   image 3

图片标签

[1,0,0][0,1,0][0,0,1]

我的python代码

#loading 3 images and resizing them
imgs = np.array([np.array(Image.open("./Images/train/" + fname)
                          .resize((197, 197), Image.ANTIALIAS)) for fname in
                 os.listdir("./Images/train/")]).reshape(-1,197,197,1)
# creating labels
y = np.array([[1,0,0],[0,1,0],[0,0,1]])
# create resnet model
model = ResNet50(input_shape=(197, 197,1),classes=3,weights=None)

# compile & fit model
model.compile(loss='categorical_crossentropy', optimizer='adam',metrics=['acc'])

model.fit(imgs,y,epochs=5,shuffle=True)

# predict on training data
print(model.predict(imgs))

该模型过度拟合数据:

3/3 [==============================] - 22s - loss: 1.3229 - acc: 0.0000e+00
Epoch 2/5
3/3 [==============================] - 0s - loss: 0.1474 - acc: 1.0000
Epoch 3/5
3/3 [==============================] - 0s - loss: 0.0057 - acc: 1.0000
Epoch 4/5
3/3 [==============================] - 0s - loss: 0.0107 - acc: 1.0000
Epoch 5/5
3/3 [==============================] - 0s - loss: 1.3815e-04 - acc: 1.0000

但预测是:

 [[  1.05677405e-08   9.99999642e-01   3.95520459e-07]
 [  1.11955103e-08   9.99999642e-01   4.14905685e-07]
 [  1.02637095e-07   9.99997497e-01   2.43751242e-06]]

表示所有图片都获得label=[0,1,0]

为什么呢?这怎么可能发生?

4 个答案:

答案 0 :(得分:14)

这是因为批量规范化层。

在培训阶段,批次被标准化为w.r.t.它的均值和方差。但是,在测试阶段,批次被标准化为w.r.t.先前观察到的均值和方差的移动平均值

现在,当观察到的批次数很少时(例如,在您的示例中为5),这是一个问题,因为在BatchNormalization层中,默认情况下moving_mean被初始化为0并且{{1初始化为1。

鉴于默认moving_variance为0.99,您需要在收敛到“真实”均值和方差之前更新移动平均值很多次。 / p>

这就是为什么预测在早期阶段是错误的,但在1000个时期之后是正确的。

您可以通过强制momentum图层以“训练模式”运行来验证它。

在训练期间,准确度为1且损失接近于零:

BatchNormalization

现在,如果我们评估模型,我们会观察到高损耗和低精度,因为经过5次更新后,移动平均线仍然非常接近初始值:

model.fit(imgs,y,epochs=5,shuffle=True)
Epoch 1/5
3/3 [==============================] - 19s 6s/step - loss: 1.4624 - acc: 0.3333
Epoch 2/5
3/3 [==============================] - 0s 63ms/step - loss: 0.6051 - acc: 0.6667
Epoch 3/5
3/3 [==============================] - 0s 57ms/step - loss: 0.2168 - acc: 1.0000
Epoch 4/5
3/3 [==============================] - 0s 56ms/step - loss: 1.1921e-07 - acc: 1.0000
Epoch 5/5
3/3 [==============================] - 0s 53ms/step - loss: 1.1921e-07 - acc: 1.0000

但是,如果我们手动指定“学习阶段”变量并让model.evaluate(imgs,y) 3/3 [==============================] - 3s 890ms/step [10.745396614074707, 0.3333333432674408] 图层使用“实际”批次均值和方差,则结果与BatchNormalization中观察到的结果相同。 / p>

fit()

也可以通过将动量更改为更小的值来验证它。

例如,通过将sample_weights = np.ones(3) learning_phase = 1 # 1 means "training" ins = [imgs, y, sample_weights, learning_phase] model.test_function(ins) [1.192093e-07, 1.0] 添加到momentum=0.01中的所有批量规范图层,20个时期之后的预测为:

ResNet50

答案 1 :(得分:0)

发生的事情基本上是keras.fit()即您的

model.fit()

最适合时,精度会丢失。因为精度会损失,模型拟合会带来问题并导致结果多样化。keras.fit仅具有良好的拟合度,而不是所需的精度

答案 2 :(得分:0)

与EfficientNet(90%的准确度)相比,ResNet50 / 101/152在采用Francios Cholett提供的给定权重的情况下,预测的结果非常糟糕(15〜50%的准确度)。它与权重无关,但与上述模型的固有复杂性有关。换句话说,有必要重新训练上述模型以预测给定图像。但是EfficientNet不需要这样的训练就可以预测图像。

例如,给定经典的猫图片,它显示的最终结果如下。

1。采用解码_预测

from keras.applications.imagenet_utils import decode_predictions

预测:[[('n01930112','线虫',0.122968934),('n03041632','切肉刀,0.04236396),('n03838899','双簧管',0.03846453),('n02783161','圆珠笔',0.027445247),('n04270147','spatula',0.024508419)]]

2。采用CV2

img = cv2.resize(cv2.imread('/home/mike/Documents/keras_resnet_common/images/cat.jpg'), (224, 224)).astype(np.float32)

# Remove the train image mean
img[:,:,0] -= 103.939
img[:,:,1] -= 116.779
img[:,:,2] -= 123.68

预测:[[('n04065272','recreational_vehicle',0.46529356),('n01819313','sulphur-crested_cockatoo',0.31684962),('n04074963','remote_control',0.051597465),('n02111889',, 'Samoyed',0.040776145),('n04548362','wallet',0.029898684)]]

因此,即使没有权重训练,ResNet50 / 101/152模型也不适合预测未经训练的图像。但是用户可以在训练100到1000个时元后感受到其价值,因为它有助于获得更好的移动平均值。如果用户希望轻松进行预测,那么在给定权重的情况下,EfficientNet是一个不错的选择。

答案 3 :(得分:0)

ResNet50V2(第二版)在预测给定图像(例如古典埃及猫)方面的准确性比ResNet50高得多。

预测:[[('n02124075','Egyptian_cat',0.8233388),('n02123159','tiger_cat',0.103765756),('n02123045','tabby',0.07267675),('n03958227','plastic_bag ',3.6531426e-05),('n02127052','lynx',3.647774e-05)]]