【问题标题】:Loss always go to nan when transfer learning by ResNet50 in keraskeras 中 ResNet50 进行迁移学习时,损失总是归于 nan
【发布时间】:2018-11-13 15:02:41
【问题描述】:

我正在使用迁移学习通过Keras 中的ResNet50 模型并通过加载预先训练的权重来训练图像分类器,但loss 最初和立即转到nan 并且acc 留在在随机级别。

其实我也不知道哪里出了问题,因为我已经用这个模型成功地训练了一个分类器,虽然它的acc不高但是效果很好。这次失败了。

我调整了lr,但什么也没发生。有人说数据可能有问题,所以我改变了数据,结果发现不同的图像同一个模型会显示不同的结果(也就是说,一些数据/图像效果很好,另一些数据/图像会立即结果loss:nan )。怎么可能?我真的很困惑,无法弄清楚我的图像有什么问题。

数据集:8 个类,每个类包含大约 300 张图像。

这里是所有人的代码:

import keras
import h5py
import numpy as np
import matplotlib.pyplot as plt

from keras.applications import ResNet50
from keras.models import Sequential
from keras.layers import Dense, Flatten, GlobalAveragePooling2D
from keras.applications.resnet50 import preprocess_input
from keras.preprocessing.image import ImageDataGenerator


data_generator = ImageDataGenerator(preprocessing_function= preprocess_input, 
                        rescale = 1./255)

train_generator = data_generator.flow_from_directory("image/train", 
                        target_size = (100, 100), 
                        batch_size = 32, 
                        class_mode = "categorical")
dev_generator = data_generator.flow_from_directory("image/dev", 
                        target_size = (100, 100), 
                        batch_size = 32, 
                        class_mode = "categorical")

num_classes = 8
model = Sequential()
model.add(ResNet50(include_top = False, pooling = "avg", weights= "resnet50_weights_tf_dim_ordering_tf_kernels_notop.h5"))
model.add(Dense(num_classes, activation = "softmax"))
model.layers[0].trainable = False

model.compile(optimizer= "adam", loss= "categorical_crossentropy", metrics=["accuracy"])

model.fit_generator(train_generator, steps_per_epoch= 1, epochs = 1)

运行输出为:

Epoch 1/1
1/1 [==============================] - 6s 6s/step - loss: nan - acc: 0.0938

【问题讨论】:

    标签: python tensorflow neural-network keras generator


    【解决方案1】:

    先把“image/dev”改成"image/dev"

    我认为你的错误在于这一行:

    data_generator = ImageDataGenerator(preprocessing_function= preprocess_input, rescale = 1./255)
    

    当您同时使用 preprocess_input 函数和 rescale = 1./255 时,您的数据会加倍缩放。尝试删除重新缩放...

    data_generator = ImageDataGenerator(preprocessing_function= preprocess_input)
    

    【讨论】:

    • 感谢您的更正,我尝试了您的建议,但仍然收到loss:nan。但后来我发现问题出在哪里:target_size = (100, 100)。我将其更改为(256,256),然后我得到了- loss: 1.9285 - acc: 0.3125。我不知道为什么,因为我的图像大小是(100,100),也许这是一个复杂的数学问题。
    • resnet50 最初是使用 (224,224) 大小的图像进行训练的。使用这种图像尺寸,您将获得更好的分数是合乎逻辑的。
    猜你喜欢
    • 2021-11-02
    • 2020-02-11
    • 2017-04-08
    • 1970-01-01
    • 1970-01-01
    • 2017-12-21
    • 1970-01-01
    • 2019-08-24
    • 2019-07-09
    相关资源
    最近更新 更多