【发布时间】:2020-07-16 08:48:49
【问题描述】:
我有一个包含 180k 图像的数据集,我尝试识别图像上的字符(车牌识别)。所有这些车牌都包含 7 个字符,并且可能有 35 个字符,因此输出向量 y 的形状为 (7, 35)。因此,我对每个车牌标签进行了 onehot 编码。
我应用了 EfficicentNet-B0 模型的底部 (https://keras.io/api/applications/efficientnet/#efficientnetb0-function) 和一个定制的顶部,它分为 7 个分支(因为每个车牌有七个字符)。我使用了imagenet的权重,冻结了efnB0_model的底层:
def create_model(input_shape = (224, 224, 3)):
input_img = Input(shape=input_shape)
model = efnB0_model (input_img)
model = GlobalAveragePooling2D(name='avg_pool')(model)
model = Dropout(0.2)(model)
backbone = model
branches = []
for i in range(7):
branches.append(backbone)
branches[i] = Dense(360, name="branch_"+str(i)+"_Dense_16000")(branches[i])
branches[i] = BatchNormalization()(branches[i])
branches[i] = Activation("relu") (branches[i])
branches[i] = Dropout(0.2)(branches[i])
branches[i] = Dense(35, activation = "softmax", name="branch_"+str(i)+"_output")(branches[i])
output = Concatenate(axis=1)(branches)
output = Reshape((7, 35))(output)
model = Model(input_img, output)
return model
model.compile(optimizer="adam", loss="categorical_crossentropy", metrics=["accuracy"])
对于模型的训练和验证,我只使用了 10.000 张训练图像和 3.000 张验证图像,因为我的模型很大,而且数据量很大,这会使我的训练非常非常缓慢。
我使用这个 DataGenerator 为我的模型提供批次:
class DataGenerator(Sequence):
def __init__(self, x_set, y_set, batch_size):
self.x, self.y = x_set, y_set
self.batch_size = batch_size
def __len__(self):
return math.ceil(len(self.x) / self.batch_size)
def __getitem__(self, idx):
batch_x = self.x[idx*self.batch_size : (idx + 1)*self.batch_size]
batch_x = np.array([resize(imread(file_name), (224, 224)) for file_name in batch_x])
batch_x = batch_x * 1./255
batch_y = self.y[idx*self.batch_size : (idx + 1)*self.batch_size]
batch_y = np.array(batch_y)
return batch_x, batch_y
我使用以下代码拟合模型:
model.fit_generator(generator=training_generator,
validation_data=validation_generator,
steps_per_epoch = num_train_samples // 32,
validation_steps = num_val_samples // 32,
epochs = 10, workers=6, use_multiprocessing=True)
现在,经过几个时期的训练,我发现在训练准确度和验证准确度方面存在很大差异。我认为,其中一个原因是数据量小。还有哪些其他因素会影响我的模型中的这种过度拟合?你认为我的代码/模型有什么问题吗?您是否认为模型也很大很复杂,或者可能是由于数据的预处理?
注意:我已经尝试了数据增强并尝试了没有迁移学习的模型。这导致训练和验证数据的结果不佳。那么,还有什么我可以做的吗?
【问题讨论】:
-
就像你说的,你的模型很大。如您所见,用这么少的数据集训练这么大的模型很容易导致过度训练。更多的数据从来都不是坏事,只要保持批次大小足够小,就不会压倒你的 GPU。您也没有说明您是否使用过任何图像预处理,这将在这种情况下对您有所帮助。
-
与 CPU 相比,GPU 上的训练速度较慢可归因于多种原因,从兼容性到驱动程序。您可以尝试将密集层的数量减少到 2。我建议训练一个找到边界框并裁剪车牌的网络,然后使用其他一些网络/算法来识别字母/数字。
-
试试 10k train 和 2k val ?也许 1k 还不够……对于性能问题,也许可以试试 Google 协作:colab.research.google.com 我建议也试试 CNN :)
-
@Tobitor 将取决于您的 GPU,尝试推送尽可能高的批次。 8/16 会被认为是 mini-batch,这是一种常见的技术,但我认为 8 太小了。
-
您是否检查过 EfficicentNet-B0 训练是否正确冻结?
标签: python tensorflow keras conv-neural-network