【发布时间】:2019-03-20 11:55:28
【问题描述】:
我想训练一个卷积神经网络来识别两种类型的类。
我还想使用已经训练好的模型(如 InceptionV3)的第一个卷积层。
然而,训练过程真的很慢。你有什么建议我可以改进吗?我不会提到我的 CPU、RAM,我在这里只关心瓶颈在哪里以及我可以改进什么来加快速度(我的图像已经是 229x299x3)。
from keras.applications import InceptionV3
from keras import layers
from keras.models import Model
from keras import optimizers
from keras.preprocessing.image import ImageDataGenerator
import numpy as np
import os
def generator(images_dir):
datagen = ImageDataGenerator(rescale=1. / 255)
gen = datagen.flow_from_directory(
images_dir,
target_size=(segment_size, segment_size),
batch_size=batch_size,
class_mode='categorical',
shuffle=True)
return gen
def num_files_in_folder(folder):
count = 0
for subdir, dirs, files in os.walk(folder):
for file in files:
if not file.startswith("."):
count += 1
return count
segment_size = 229
batch_size = 32
base_model = InceptionV3(weights='imagenet',
include_top=False,
input_shape=(segment_size, segment_size, 3))
x = base_model.output
x = layers.GlobalAveragePooling2D()(x)
x = layers.Dense(1024, activation='relu')(x)
predictions = layers.Dense(2, activation='softmax')(x)
model = Model(inputs=base_model.input, outputs=predictions)
for layer in base_model.layers:
layer.trainable = False
model.compile(optimizer=optimizers.SGD(lr=0.01, nesterov=True),
loss='categorical_crossentropy',
metrics=['acc'])
train_dir = "/home/user/train"
validation_dir = "/home/user/val"
train_gen = generator(train_dir)
val_gen = generator(validation_dir)
steps_per_epoch = int(np.ceil(num_files_in_folder(train_dir) / batch_size))
validation_steps = int(np.ceil(num_files_in_folder(validation_dir) / batch_size))
history = model.fit_generator(
generator=train_gen,
steps_per_epoch=steps_per_epoch,
epochs=10,
validation_data=val_gen,
validation_steps=validation_steps,
use_multiprocessing=False,
verbose=1)
【问题讨论】:
-
定义“真的很慢”。你用的是CPU还是GPU?如果是后者,利用率是多少?
-
嗨鲨鱼。我将它与我拥有的另一个实现进行了比较。在那里,我通过
incepv3.predict(generator)从预训练模型中提取特征,然后将它们保存到 pickle 文件中。在这一切完成之后,我运行另一个 Python 脚本,该脚本通过另一个生成器读取泡菜文件并将内容传递给我的最终模型。这个 impl 需要大约 25 分钟的特征提取和 2 分钟的训练。我在此处粘贴的代码使用相同的 CPU 处理相同的图像、相同的 epoch 数等超过 2 小时。 -
正如答案所暗示的,您应该使用数据集 api。我不会直接从 tfrecords 格式开始,因为它并不总是有优势,而且它本身需要时间来转换。您可以选择使用没有 pickle 的普通 numpy 数组吗?为什么要使用它?
-
我的数据不适合内存。我找不到从文件系统中读取所有 SxSx3 图像的方法,将它们提供给
inceptV3.predict并将结果传递给我的model.fit_generator,需要将所有内容加载到内存中。 -
您的初始数据是什么样的?它是一个大的 numpy 数组吗?还是图片目录?
标签: python tensorflow keras conv-neural-network