python - 使用 tf.keras 和 Inception-v3 进行迁移学习:没有进行任何训练
问题描述
我正在尝试基于冻结的 Inception_v3 模型训练模型,其中 3 个类作为输出。当我进行训练时,训练准确率上升,但验证准确率不高,或多或少精确到 33.33%,即显示完全随机预测。我不知道我的代码和/或方法中的错误在哪里
在 Inception v3 核心之后,我尝试了各种形式的输出,完全没有区别。
# Model definition
# InceptionV3 frozen, flatten, dense 1024, dropout 50%, dense 1024, dense 3, lr 0.001 --> does not train
# InceptionV3 frozen, flatten, dense 1024, dense 3, lr 0.001 --> does not train
# InceptionV3 frozen, flatten, dense 1024, dense 3, lr 0.005 --> does not train
# InceptionV3 frozen, GlobalAvgPooling, dense 1024, dense 1024, dense 512, dense 3, lr 0.001 --> does not train
# InceptionV3 frozen, GlobalAvgPooling dropout 0.4 dense 3, lr 0.001, custom pre-process --> does not train
# InceptionV3 frozen, GlobalAvgPooling dropout 0.4 dense 3, lr 0.001, custom pre-process, batch=32 --> does not train
# InceptionV3 frozen, GlobalAvgPooling dropout 0.4 dense 3, lr 0.001, custom pre-process, batch=32, rebalance train/val sets --> does not train
IMAGE_SIZE = 150
BATCH_SIZE = 32
def build_model(image_size):
input_tensor = tf.keras.layers.Input(shape=(image_size, image_size, 3))
inception_base = InceptionV3(include_top=False, weights='imagenet', input_tensor=input_tensor)
for layer in inception_base.layers:
layer.trainable = False
x = inception_base.output
x = tf.keras.layers.GlobalAveragePooling2D()(x)
x = tf.keras.layers.Dropout(0.2)(x)
output_tensor = tf.keras.layers.Dense(3, activation="softmax")(x)
model = tf.keras.Model(inputs=input_tensor, outputs=output_tensor)
return model
model = build_model(IMAGE_SIZE)
model.compile(optimizer=RMSprop(lr=0.002), loss='categorical_crossentropy', metrics=['acc'])
# Data generators with Image augmentations
train_datagen = ImageDataGenerator(
rescale=1./255,
preprocessing_function=tf.keras.applications.inception_v3.preprocess_input,
rotation_range=40,
width_shift_range=0.2,
height_shift_range=0.2,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True,
fill_mode='nearest')
# Do not augment validation!
validation_datagen = ImageDataGenerator(
rescale=1./255,
preprocessing_function=tf.keras.applications.inception_v3.preprocess_input)
train_generator = train_datagen.flow_from_directory(
train_dir,
target_size=(IMAGE_SIZE, IMAGE_SIZE),
batch_size=BATCH_SIZE,
class_mode='categorical')
validation_generator = validation_datagen.flow_from_directory(
valid_dir,
target_size=(IMAGE_SIZE, IMAGE_SIZE),
batch_size=BATCH_SIZE,
class_mode='categorical')
该单元格的输出为:
找到属于 3 个类别的 1697 张图像。找到属于 3 个类别的 712 个图像。
最后两个训练阶段的输出:
纪元 19/20
23/23 [===============================] - 6s 257ms/step - loss: 1.1930 - acc : 0.3174
54/54 [===============================] - 20s 363ms/步 - 损失: 0.7870 - acc: 0.6912 - val_loss:1.1930 - val_acc:0.3174
Epoch 20/20
23/23 [==============================] - 6s 255ms /step - loss: 1.1985 - acc: 0.3160
54/54 [===============================] - 20s 362ms/step - 损失:0.7819 - acc:0.7018 - val_loss:1.1985 - val_acc:0.3160
解决方案
唯一让我大吃一惊的是放弃rescale=1./255
ImageDataGenerators
,因为这也由 处理tf.keras.applications.inception_v3.preprocess_input
,它将从 -1 缩放到 1;网络的预期输入。
推荐阅读
- fo-dicom - 如何在 fo dicom 中向 DicomDirectory 添加结构化报告?
- javascript - ExtJS 列渲染器、行数和 setLoading
- c# - C# 使用带有异常的堆栈
- database - 如何在 Core Data 中使用 SUBQUERY 按多个关系计数过滤实体
- wpf - 获取绑定 ViewModel 的对话框属性
- azure - Azure 函数触发器不适用于 cosmosdb 的不同资源 ID
- python - python:根据另一个dict列表过滤dict列表
- spring-batch - Spring Batch 一次启动多个作业?
- r - 将四分之一字符转换为 R 中的日期对象
- forms - Coldfusion - 更新表格