我正在尝试在 c5.large 实例 (AWS) 上迁移学习预训练的 MobileNet 模型。
我是第一次训练(老化)最后一个密集层几个时期(在 5-20 之间尝试,似乎并不重要)。
在老化期之后,我想训练完整的模型。但是,这会在几个 epoch 之后停止而没有错误。
早些时候,我尝试过没有老化期,并且效果“很好”。通常会在大约 50 个 epoch 后使服务器崩溃(这就是我添加 clipnorm 的原因,这确实有点帮助)。
欢迎任何关于如何调试的想法。
控制台输出:
Total params: 3,239,114
Trainable params: 3,217,226
Non-trainable params: 21,888
_________________________________________________________________
Epoch 6/25
1/46 [..............................] - ETA: 9:22 - loss: 0.2123
2/46 [>.............................] - ETA: 7:46 - loss: 0.2028ubuntu@ip-XXX:~$ ls
培训代码:
base_model = _mobilenet.MobileNet(
input_shape=(224, 224, 3), include_top=False, pooling="avg"
)
if not options.mobile_net_weights:
pretrained_weights = os.path.join(
os.path.dirname(pretrained.__file__), "weights_mobilenet_aesthetic_0.07.hdf5"
)
base_model.load_weights(pretrained_weights, by_name=True)
# add dropout and dense layer
x = Dropout(0.6)(base_model.output)
x = Dense(units=classes, activation=last_activation)(x)
pretrained_model = Model(base_model.inputs, x)
# start training only dense layers
for layer in base_model.layers:
layer.trainable = False
pretrained_model.compile(loss=loss, optimizer=Adam(lr=0.001, decay=0, clipnorm=1.0))
pretrained_model.summary()
# add path equal to image_id
labels = [dict(item, **{"path": item["image_id"]}) for item in load_json(labels_path)]
training, validation = train_test_split(labels, test_size=0.05, shuffle=True)
train_data_gen = _DataGenerator(
training,
batch_size=options.batch_size,
base_dir=options.image_path,
n_classes=classes,
basenet_preprocess=_mobilenet.preprocess_input,
)
validation_data_gen = _DataGenerator(
validation,
batch_size=options.batch_size,
base_dir=options.image_path,
n_classes=classes,
basenet_preprocess=_mobilenet.preprocess_input,
training=False,
)
train_job_dir = f"train_jobs/{datetime.datetime.now().isoformat()}"
train_job_dir = os.path.join(options.results_path, train_job_dir)
tensorboard = TensorBoardBatch(log_dir=os.path.join(train_job_dir, "logs"))
model_save_name = "weights_{epoch:02d}_{val_loss:.3f}.hdf5"
model_file_path = os.path.join(train_job_dir, "weights", model_save_name)
if not os.path.exists(os.path.join(train_job_dir, "weights")):
os.makedirs(os.path.join(train_job_dir, "weights"))
model_checkpointer = ModelCheckpoint(
filepath=model_file_path,
monitor="val_loss",
verbose=1,
save_best_only=True,
save_weights_only=True,
)
pretrained_model.fit_generator(
train_data_gen,
steps_per_epoch=len(training) / options.batch_size / 10,
epochs=5,
verbose=1,
callbacks=[tensorboard, model_checkpointer],
validation_data=validation_data_gen,
validation_steps=len(validation) / options.batch_size,
)
# start training all layers
for layer in base_model.layers:
layer.trainable = True
pretrained_model.compile(
loss=loss, optimizer=Adam(lr=0.0001, decay=0.000023, clipnorm=1.0)
)
pretrained_model.summary()
pretrained_model.fit_generator(
train_data_gen,
steps_per_epoch=len(training) / options.batch_size / 10,
epochs=25,
initial_epoch=5,
verbose=1,
callbacks=[tensorboard, model_checkpointer],
validation_data=validation_data_gen,
validation_steps=len(validation) / options.batch_size,
)
更新和跟进
最初的问题似乎是由机器上的可用内存太少引起的。不过,我确实有一个不相关但相关的问题。在尝试使用 GPU 加速时,我一直在用头撞墙,因为我似乎无法让它工作。
是否有任何好的(逻辑结构和易于理解的)信息如何使用:
- 本地机器上的 Docker(构建启用 GPU 加速的映像)
- 在 GPU 实例上安装所有相关的(nvidia-)驱动程序(多么疯狂的版本混乱)
- 运行 Docker 容器(nvidia-docker2、nvidia-docker 或 --runtime==nvidia ??)
- Cuda到底是什么,我为什么需要它?
- 我发现的一些资源建议在 Docker 中运行 Cuda,为什么?
当我似乎得到了一些工作(即设置驱动程序,某个版本)并设法构建了一个启用 GPU(即 tensorflow-gpu)的 Docker 映像时,我收到了这个错误:
docker:来自守护进程的错误响应:OCI 运行时创建失败:container_linux.go:345:启动容器进程导致“process_linux.go:430:容器初始化导致\”process_linux.go:413:运行预启动挂钩1 导致\“错误运行钩子:退出状态1,标准输出:,标准错误:执行命令:[/usr/bin/nvidia-container-cli --load-kmods configure --ldconfig=@/sbin/ldconfig.real --device=all --compute --utility --require=cuda>=10.0 brand=tesla,driver>=384,driver<385 brand=tesla,driver>=410,driver<411 --pid=2113 /var/lib/docker/overlay2/4bf49d2555c40278b3249f73bf3d33484181f51b374b77b69a174fc39e347 /merged]\\nnvidia-container-cli:要求错误:不满足条件:驱动程序 >= 410\\n\\"\"":未知。