Keras DataGenerator报错:(512,512)数组无法广播到(512,512,2)形状
问题根因
报错由数组形状不匹配直接导致:
- 你实例化
DataGenerator时传入了n_channels=2,因此__data_generation方法里预创建的特征数组X,单个样本的预留形状是(512,512,2) - 但
load_dicom_xray方法读取DICOM文件得到的是单通道灰度图,返回的数组形状只有(512,512),无法直接赋值给形状为(512,512,2)的数组切片,因此触发广播错误。
额外注意:你写的if data.mean() == 0分支直接返回原始数组,就算修正了通道数,走到这个分支时依然会因为缺通道维度触发同样错误。
修复方案
根据你实际的模型输入需求二选一即可:
- 方案1:使用单通道输入(匹配原始DICOM胸片的灰度属性,绝大多数医学影像分类场景用这个就够)
- 把生成器初始化参数里的
n_channels=2改为n_channels=1 - 在
load_dicom_xray的两个返回分支前,都给数组补充末尾的通道维度,保证返回形状为(512,512,1)
- 把生成器初始化参数里的
- 方案2:确实需要2通道输入(比如要拼接原图和预处理特征、原图和标注mask等场景)
在load_dicom_xray中补充第二通道的逻辑,保证最终返回数组形状为(512,512,2),最简单的验证方式可以先把单通道复制为2通道确认流程跑通,再替换成你实际需要的第二通道数据。
修正后参考代码(单通道场景)
class DataGenerator(Sequence): def __getitem__(self, index): indexes = self.indexes[index * self.batch_size:(index + 1) * self.batch_size] list_IDs_temp = [self.list_IDs[k] for k in indexes] X,y= self.__data_generation(list_IDs_temp) return X, y def on_epoch_end(self): self.indexes = np.arange(len(self.list_IDs)) if self.shuffle == True: np.random.shuffle(self.indexes) def __data_generation(self, list_IDs_temp): X = np.empty((self.batch_size, self.dim[0], self.dim[1], self.n_channels)) y = np.empty((self.batch_size), dtype=int) for i, ID in enumerate(list_IDs_temp): X[i,] = self.load_dicom_xray(self.image_path[ID]) y[i] = self.labels[ID] return X, keras.utils.to_categorical(y, num_classes=self.n_classes) def load_dicom_xray(self, path): data = pydicom.read_file(path).pixel_array if data.mean() == 0: # 全黑图也要补通道维度 data = np.expand_dims(data, axis=-1) return data data = data - np.min(data) data = data / np.max(data) data = (data * 255).astype(np.uint8) # 补充通道维度 data = np.expand_dims(data, axis=-1) return data # n_channels改为1,匹配单通道输入 training_gen = DataGenerator( index, train_df['Sınıf'], dim=(512,512), n_channels=1, n_classes=10, batch_size=64, shuffle=True, image_path=paths )
如果选2通道方案,只需要把load_dicom_xray最后加维度的部分替换成对应逻辑即可,比如复制单通道到2通道的写法:
# 替换expand_dims那行即可 data = np.repeat(np.expand_dims(data, axis=-1), 2, axis=-1)
内容的提问来源于stack exchange,提问作者super bob
相关产品推荐
相关产品推荐

