tensorflow - 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 的向量,所以我无法预测任何东西。
解决方案
来自评论
您需要
26
在最后一层上使用单位,并且tf.keras.losses.CategoricalCrossentropy(from_logits=True)
或者
您可以使用
Dense(26, activation = tf.nn.softmax)
并保持损失函数原样(从 Nicolas Gervais 和 Frightera 转述)
推荐阅读
- python - Tensorflow 中的 YOLO v2 精度差
- mysql - Docker:尝试设置 2 个数据库容器时的 MySQL [2002]
- loops - 如何在 VBScript 中中断或退出 With..End With 循环
- java - 这些使 URLDecoder 与 UTF-8 崩溃的符号是什么?
- python - 如何模拟线程之间的广播消息传递
- mysql - 存储博客文件
- html - 如何设置从父 ngb 下拉菜单继承的 ngb 下拉菜单的宽度附加到正文?
- sql - 如何通过比较 2 个不同的日期列来删除基于 1 列的重复 SQL 行?
- git - 我如何计算子文件夹的生命周期 git commit 大小?在整个 git 存储库大小中占用了多少子文件夹?
- javascript - dy在js中的span元素中没有改变