[英]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
通常,您将大部分网络计算花费在dense2
上,因为来自flatten
的传入维度非常大。 这似乎效率低下。 在此之前更积极的下采样应该会增加 model 吞吐量。 您可以通过使用更多卷积层来补偿参数/表达能力的降低。 卷积及其对图像的归纳偏差也有助于比密集层更好地泛化。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.