CNN图像分类训练报错‘boundary mode not supported’求助
解决RuntimeError: boundary mode not supported问题
问题背景
跟着教程做图像分类,用CNN构建了如下模型:
model=tf.keras.models.Sequential([ #first layer an input layer a shape of 100*150 RGP array of pictures # 2D convutional layer with 32 nodes 3*3 filter tf.keras.layers.Conv2D(32,(3,3),activation='relu',input_shape=(100,150,3)), #2d maxpooling with size of 2*2 tf.keras.layers.MaxPooling2D(2,2), #second layer tf.keras.layers.Conv2D(64,(3,3),activation='relu'), tf.keras.layers.MaxPooling2D(2,2), #third layer tf.keras.layers.Conv2D(128,(3,3),activation='relu'), tf.keras.layers.MaxPooling2D(2,2), #forth layer tf.keras.layers.Conv2D(256,(3,3),activation='relu'), tf.keras.layers.MaxPooling2D(2,2), #flatten layer tf.keras.layers.Flatten(), #dense layer tf.keras.layers.Dense(512,activation='relu'), tf.keras.layers.Dense(3,activation='softmax') ]) model.compile(loss='categorical_crossentropy',optimizer=tf.optimizers.Adam(), metrics=['accuracy'])
运行训练代码时触发错误:
history=model.fit(train_gen,steps_per_epoch=25,epochs=20, validation_data=validation_gen,validation_steps=5,verbose=2, callbacks=[my_callback()] )
报错回溯:
--------------------------------------------------------------------------- RuntimeError Traceback (most recent call last) c:\Users\rabee\OneDrive\Desktop\rps-final-dataset\rbs_classification.ipynb Cell 20 in <cell line: 1>() ----> 1 model.fit(train_gen,steps_per_epoch=25,epochs=20, 2 validation_data=validation_gen,validation_steps=5,verbose=2, 3 callbacks=[my_callback()] 4 5 ) File c:\Users\rabee\AppData\Local\Programs\Python\Python310\lib\site-packages\keras\utils\traceback_utils.py:67, in filter_traceback.<locals>.error_handler(*args, **kwargs) 65 except Exception as e: # pylint: disable=broad-except 66 filtered_tb = _process_traceback_frames(e.__traceback__) ---> 67 raise e.with_traceback(filtered_tb) from None 68 finally: 69 del filtered_tb File c:\Users\rabee\AppData\Local\Programs\Python\Python310\lib\site-packages\scipy\ndimage\_interpolation.py:574, in affine_transform(input, matrix, offset, output_shape, output, order, mode, cval, prefilter) 572 npad = 0 573 filtered = input --> 574 mode = _ni_support._extend_mode_to_code(mode) 575 matrix = numpy.asarray(matrix, dtype=numpy.float64) 576 if matrix.ndim not in [1, 2] or matrix.shape[0] < 1: File c:\Users\rabee\AppData\Local\Programs\Python\Python310\lib\site-packages\scipy\ndimage\_ni_support.py:54, in _extend_mode_to_code(mode) 52 return 6 53 else: ---> 54 raise RuntimeError('boundary mode not supported') RuntimeError: boundary mode not supported
错误原因
这个错误根源在图像生成器的预处理参数,具体是scipy的ndimage模块不识别你设置的边界填充模式。比如用ImageDataGenerator时fill_mode设了scipy不支持的值,或者自定义生成器里调用scipy图像函数时传了无效的mode参数。
解决方法
- 检查ImageDataGenerator的fill_mode参数
确保fill_mode用scipy支持的取值:'nearest'、'reflect'、'constant'、'wrap'。比如把生成器改成这样:from tensorflow.keras.preprocessing.image import ImageDataGenerator # 训练集生成器 train_gen = ImageDataGenerator( rescale=1./255, fill_mode='nearest' # 替换成支持的模式,别用'mirror'这类scipy不认的 ).flow_from_directory( # 你的路径和其他参数 ) # 验证集同理 validation_gen = ImageDataGenerator( rescale=1./255, fill_mode='nearest' ).flow_from_directory( # 你的路径和其他参数 ) - 排查自定义数据生成器
如果是自己写的生成器,在做图像变换(缩放、旋转等)调用scipy函数时,确保mode参数是上述支持的值,别传拼写错误或不兼容的字符串。 - 升级scipy版本
版本不兼容也可能导致这个问题,执行命令升级到最新稳定版:pip install --upgrade scipy - 检查自定义回调函数
你的my_callback()如果涉及图像处理逻辑,也要排查里面有没有用到不支持的边界模式参数。
内容的提问来源于stack exchange,提问作者noob
相关产品推荐
相关产品推荐

