繁体   English   中英

提高图像分类性能 model

[英]Improve performance on image classification model

我目前正在研究图像分类 model 来识别 101 种不同类型的食物,使用由 101.000 张图像(每类 1000 张)组成的数据集。 我正在Google Colab中开发此分类器并使用Tensorflow 2.4.1

为了提高性能,我在我的数据集中添加了ds.cache()ds.prefetch()语句,但是这样做, colab在第一个训练时期很快耗尽了 RAM,并且进程被终止。

性能调优

AUTOTUNE = tf.data.AUTOTUNE
train_ds = train_ds.cache().shuffle(1000).prefetch(buffer_size=AUTOTUNE)
val_ds = val_ds.cache().prefetch(buffer_size=AUTOTUNE)

我还定义了一个标准化层,将图像的 RGB 通道简化为 [0,1] 向量:

normalization_layer = layers.experimental.preprocessing.Rescaling(1./255)

normalized_ds = train_ds.map(lambda x, y: (normalization_layer(x), y))
image_batch, labels_batch = next(iter(normalized_ds))
first_image = image_batch[0]
# Notice the pixels values are now in `[0,1]`.
print(np.min(first_image), np.max(first_image))

但是,通过从数据集中删除ds.cache()ds.prefetch()函数,训练变得非常慢:

Epoch 1/2 86/2525 [>.............................] - ETA: 6:37 - loss: 4.6159 - accuracy: 0.0099

下面是我的 model 规范和摘要,我正在使用adam 优化器稀疏分类交叉熵损失 function。

num_classes = 101

model = Sequential([
  layers.experimental.preprocessing.Rescaling(1./255, input_shape=(img_height, img_width, 3)),
  layers.Conv2D(16, 3, padding='same', activation='relu'),
  layers.MaxPooling2D(),
  layers.Conv2D(32, 3, padding='same', activation='relu'),
  layers.MaxPooling2D(),
  layers.Conv2D(64, 3, padding='same', activation='relu'),
  layers.MaxPooling2D(),
  layers.Flatten(),
  layers.Dense(128, activation='relu'),
  layers.Dense(num_classes, activation='softmax')
]) 

Model: "sequential_1"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
rescaling_3 (Rescaling)      (None, 224, 224, 3)       0         
_________________________________________________________________
conv2d_3 (Conv2D)            (None, 224, 224, 16)      448       
_________________________________________________________________
max_pooling2d_3 (MaxPooling2 (None, 112, 112, 16)      0         
_________________________________________________________________
conv2d_4 (Conv2D)            (None, 112, 112, 32)      4640      
_________________________________________________________________
max_pooling2d_4 (MaxPooling2 (None, 56, 56, 32)        0         
_________________________________________________________________
conv2d_5 (Conv2D)            (None, 56, 56, 64)        18496     
_________________________________________________________________
max_pooling2d_5 (MaxPooling2 (None, 28, 28, 64)        0         
_________________________________________________________________
flatten_1 (Flatten)          (None, 50176)             0         
_________________________________________________________________
dense_2 (Dense)              (None, 128)               6422656   
_________________________________________________________________
dense_3 (Dense)              (None, 101)               13029     
=================================================================
Total params: 6,459,269
Trainable params: 6,459,269
Non-trainable params: 0
_________________________________________________________________

我可以实施哪些缓存和预取替代方案来提高训练性能?

缓存

如果没有指定缓存文件, tf.data.Dataset.cache将尝试将整个 epoch 的数据加载到 memory 中。 也许这是您内存不足的主要原因。 prefetch只缓存几批。

https://www.tensorflow.org/api_docs/python/tf/data/Dataset#cache

https://www.tensorflow.org/api_docs/python/tf/data/Dataset#prefetch

Model性能

通常,您将大部分网络计算花费在dense2上,因为来自flatten的传入维度非常大。 这似乎效率低下。 在此之前更积极的下采样应该会增加 model 吞吐量。 您可以通过使用更多卷积层来补偿参数/表达能力的降低。 卷积及其对图像的归纳偏差也有助于比密集层更好地泛化。

其他注意事项

  1. 检查您的预处理管道。 你要重新缩放两次吗? 如果数据集上的步骤更快,请在此处执行。
  2. 您是否在 Colab GPU 实例上运行?
  3. 也许考虑使用在 ImageNet 上预训练的 model,然后为您的特定任务进行迁移学习。 这应该比从头开始训练完整的 model 更快地产生良好的结果,即使预训练的 model 本身比您可以从头开始合理训练的 model 大得多。 https://www.tensorflow.org/tutorials/images/transfer_learning

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM