【发布时间】:2020-11-22 07:17:33
【问题描述】:
我正在尝试在运行 Nvidia RTX 2070 Super 的本地 PC 上为一系列图像训练 回归模型。
输入图像形状:(96,160,3),16072 个样本(12857 个用于训练,3215 个用于验证)
但是,培训没有进行。我尝试使用自定义模型,如本文所述 reference.
model = Sequential()
model.add(Conv2D(input_shape=(96, 320, 3), filters=32, kernel_size=3, padding="valid"))
model.add(MaxPooling2D(pool_size=(3,3)))
model.add(Activation('relu'))
model.add(Conv2D(filters=256, kernel_size=3, padding="valid"))
model.add(MaxPooling2D(pool_size=(3,3)))
model.add(Activation('relu'))
model.add(Conv2D(filters=512, kernel_size=3, padding="valid"))
model.add(MaxPooling2D(pool_size=(3,3)))
model.add(Activation('relu'))
model.add(Flatten())
model.add(Dense(2048))
model.add(Activation('relu'))
model.add(Dense(512))
model.add(Activation('relu'))
model.add(Dense(128))
model.add(Activation('relu'))
model.add(Dropout(0.25))
model.add(Dense(1))
checkpoint = ModelCheckpoint(filepath="./ckpts/model.ckpt", monitor='val_loss', save_best_only=True)
stopper = EarlyStopping(monitor='val_acc', min_delta=0.0003, patience = 10)
lr_schedule = ExponentialDecay(initial_learning_rate=0.1, decay_steps=10000, decay_rate=0.9)
optimizer = Adam(learning_rate=lr_schedule)
loss = Huber(delta=0.5, reduction="auto", name="huber_loss")
model.compile(loss = loss, optimizer = optimizer, metrics=['accuracy'])
model.fit(X_train, y_train, validation_split = 0.2, shuffle = True, epochs = 100,
callbacks=[checkpoint, stopper])
训练持续了 10 个 epoch,然后在耗尽 Early Stopping Algorithm 的耐心后自动终止。本质上,模型没有训练。验证准确度停留在 0.5353。
然后,怀疑我的模型本身可能有问题,我尝试了迁移学习,使用 Imagenet 权重导入预训练的 Inception V3,并尝试使用冻结权重进行训练(仅训练最后两层预训练的权重冻结)。
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Input, Lambda, Dense, Flatten, Conv2D, Activation, MaxPooling2D,
Dropout, GlobalAveragePooling2D
from tensorflow.keras.applications.inception_v3 import InceptionV3, preprocess_input
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
from tensorflow.keras.models import Model
from tensorflow.keras.callbacks import ModelCheckpoint, EarlyStopping
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.losses import Huber
from tensorflow.keras.optimizers.schedules import ExponentialDecay
X_train = preprocess_input(X_train)
inception = InceptionV3(weights='imagenet', include_top=False, input_shape=(299,299,3))
inception.trainable = False
driving_input = Input(shape=(96,320,3))
resized_input = Lambda(lambda image: tf.image.resize(image,(299,299)))(driving_input)
inp = inception(resized_input)
x = GlobalAveragePooling2D()(inp)
x = Dense(512, activation = 'relu')(x)
result = Dense(1, activation = 'relu')(x)
model = Model(inputs = driving_input, outputs = result)
model.compile(optimizer='Adam', loss='mse', metrics = ['accuracy'])
checkpoint = ModelCheckpoint(filepath="./ckpts/model.ckpt", monitor='val_loss', save_best_only=True)
stopper = EarlyStopping(monitor='val_acc', min_delta=0.0003, patience = 10)
batch_size = 32
epochs = 100
model.fit(x=X_train, y=y_train, shuffle=True, validation_split=0.2, epochs=epochs,
batch_size=batch_size, verbose=1, callbacks=[checkpoint, stopper])
我最后还尝试解冻权重并重新训练整个 InceptionV3 网络,并使用 Imagenet 预训练的权重进行初始化。
inception.trainable = True
这也没有对我的模型的性能产生任何影响。验证准确性仍然非常卡在同一个地方。
我不明白为什么我的模型没有训练。请帮我解决这个问题。请注意,一般来说,我不希望在改进我的模型方面得到帮助,我可以自己做到这一点,但我不能做的是让模型脱离困境。除非发生这种情况,否则我无法进行任何微调或优化。任何帮助将不胜感激。
【问题讨论】:
-
我认为你的问题在于你的损失函数。我不知道您要进行哪种培训,但请尝试更改损失函数。此外,最好让每层的神经元数量逐渐减少,而不是从 128(减去 dropout)减少到 1。在此处添加更多层,如果您受到 vram 的限制,则将 128 减少到更少但添加更多层.也可以尝试只使用 lr 衰减的简单 Adam 或其他一些优化器。
-
您的数据是公共数据集吗?可以分享一下吗?
-
@NiteyaShah 我刚刚在简单的 Adam 上进行了 MSE 损失训练,在 128 和 1 之间还有两个 Dense 层,分别有 54 和 16 个神经元。验证准确性仍然停滞不前。结果与帖子中的第一个输出图像非常相似。
-
@Niki 这是一个模拟数据集。让我上传给你看dropbox.com/sh/5vtobw4m8km49rt/AAB08NjkyPj8dtP9_RqSWzFka?dl=0
-
我认为你完全忽略了准确率是一个分类指标,而你正在做回归,所以在这种情况下使用这个指标是没有意义的。
标签: python tensorflow keras deep-learning conv-neural-network