首页 > 解决方案 > keras 的问题,模型不能从验证中学习

问题描述

我是 keras 的新手,我试图用一组有 26 个类的卫星图像构建一个序列模型,但是函数 model.fit_generator 无法识别验证数据,我改变了一切,我即将离开这个问题. 我的代码是:

_URL = 'https://storage.googleapis.com/kaggle-competitions-data/kaggle-v2/25487/2041232/bundle/archive.zip?GoogleAccessId=web-data@kaggle-161607.iam.gserviceaccount.com&Expires=1615640732&Signature=SVgNSgLgSEzKPYDQZQWiv33ytl6vG1JbWvKqwpIjDoN378hhv99U9NyB3MiyKeQ9bteaatA4hEAGndftP3AR%2B%2FpeHfjwjuOehvjHqaJHYqyKoGcCldDkROwu9C8sYuWV2beC5anxkShel401etLXSmumw%2FvMsfHoXqRSAd4Es0vVJZQ%2Bymmd9Ir9CqIamfxjbztl0cJYB69LfTHuxyicZmoyKbyWIQ%2BmQXXWn5QzobTJX9kOh9nKQF1hBbXeAGOpxZMAS1nCdBWKfCIRlhfY2PlacIcR1MMm1LFjSx82X0lGjjNTGf2CCOYZQAxxhjIfZuBU4U%2Bhx4JP9ClW7s%2BTFw%3D%3D&response-content-disposition=attachment%3B+filename%3Dusos-del-suelo-con-sentinel-2.zip'

path_to_zip = tf.keras.utils.get_file('usos-del-suelo-con-sentinel-2.zip', origin=_URL, extract=True)

PATH = os.path.join(os.path.dirname(path_to_zip))

train_dir = os.path.join(PATH, 'LULC_100samples2021/LULC_100samples2021_Jan_JPG')
test_dir = os.path.join(PATH, 'Test')

batch_size = 20
epochs = 10
IMG_HEIGHT = 224
IMG_WIDTH = 224

image_generator = ImageDataGenerator(validation_split = 0.2, rescale=1./255) 
test_image_generator = ImageDataGenerator(rescale=1./255)

train_data_gen = image_generator.flow_from_directory(batch_size=batch_size,
                                                     directory=train_dir,
                                                     class_mode="categorical",
                                                     subset='training',
                                                     target_size=(IMG_HEIGHT, IMG_WIDTH),
                                                     shuffle=True)

val_data_gen = image_generator.flow_from_directory(batch_size=batch_size,
                                                   directory=train_dir,
                                                   subset='validation',
                                                   class_mode="categorical",
                                                   target_size=(IMG_HEIGHT, IMG_WIDTH),
                                                   shuffle=False)

model = Sequential([
    Conv2D(16, 3, padding='same', activation='relu', input_shape=(IMG_HEIGHT, IMG_WIDTH ,3)),
    MaxPooling2D(),
    Conv2D(32, 3, padding='same', activation='relu'),
    MaxPooling2D(),
    Conv2D(64, 3, padding='same', activation='relu'),
    MaxPooling2D(),
    Flatten(),
    Dense(128, activation='relu'),
    Dense(1)
])

model.compile(loss=tf.keras.losses.CategoricalCrossentropy(), optimizer = "adam", metrics = ["accuracy"])

train_samples=2080
val_samples=520

history = model.fit_generator(
    train_data_gen,
    steps_per_epoch = train_samples // batch_size,
    validation_data = val_data_gen,
    validation_steps = val_samples // batch_size,
    epochs=epochs
)

我的问题是:准确性在任何时期都不会改变,所以我想我的模型无法识别验证数据。当我试图预测测试标签时,输出是一个 0 的向量,所以我无法预测任何东西。

标签: tensorflowkeras

解决方案


来自评论

您需要26在最后一层上使用单位,并且 tf.keras.losses.CategoricalCrossentropy(from_logits=True)

或者

您可以使用Dense(26, activation = tf.nn.softmax)并保持损失函数原样(从 Nicolas Gervais 和 Frightera 转述)


推荐阅读