最近做3D UnetCNN 医学图像的分割。按照GitHub中的https://github.com/ellisdg/3DUnetCNN官方操作,在执行 python train.py和python train_isensee2017.py时,都会出现segmentation fault的问题。查看了很多网上的资料,始终和自己遇到的问题有所差异。
1)有些人在CPU下可以正常运行,多GPU就不行,有的是单GPU可以,多GPU不行。所以怀疑是Keras多GPU设置的问题,但是程序在CPU和单GPU下仍然会出现segmentation fault的问题。
2)有时候,cudnn的版本问题也会导致segmentation fault的问题。我尝试了几个版本的cudnn,发现问题依旧存在。
3)怀疑是数据本身的问题,导致访问内存出错,尝试了Brats2018和Brats2017,结果都一样。
4)调试程序,用print语句找错误位置,程序运行到Epoch 1/500结束,始终没有找到相应的打印语句。最后找到
model.fit_generator(generator=training_generator,
steps_per_epoch=steps_per_epoch,
epochs=n_epochs,
validation_data=validation_generator,
validation_steps=validation_steps,
callbacks=get_callbacks(model_file,
initial_learning_rate=initial_learning_rate,
learning_rate_drop=learning_rate_drop,
learning_rate_epochs=learning_rate_epochs,
learning_rate_patience=learning_rate_patience,
early_stopping_patience=early_stopping_patience) )
找到fit_generator()函数的定义,发现参数位置是不对的callbacks在前面
应该是:
model.fit_generator(generator=training_generator,
steps_per_epoch=steps_per_epoch,
epochs=n_epochs,
callbacks=get_callbacks(model_file,
initial_learning_rate=initial_learning_rate,
learning_rate_drop=learning_rate_drop,
learning_rate_epochs=learning_rate_epochs,
learning_rate_patience=learning_rate_patience,
early_stopping_patience=early_stopping_patience),
validation_data=validation_generator,
validation_steps=validation_steps,
use_multiprocessing = True)
程序可以正常运行一个epoch,不会出现segmentation fault的问题。
但是程序还是未能正常运行。最后发现是Keras版本的问题,我的版本是2.2.4,降级到2.1.2就可以了。