{"record":{"id":"6d2f46758266cdc5","repo":"keras-team/keras","slug":"data-format-should-be-channels-last-channel","errorCode":null,"errorMessage":"`data_format` should be `\"channels_last\"` (channel after row and column) or `\"channels_first\"` (channel before row and column). Received: {data_format}","messagePattern":"`data_format` should be `\"channels_last\"` \\(channel after row and column\\) or `\"channels_first\"` \\(channel before row and column\\)\\. Received: (.+?)","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"keras/src/legacy/preprocessing/image.py","lineNumber":1005,"sourceCode":"        self.zca_whitening = zca_whitening\n        self.zca_epsilon = zca_epsilon\n        self.rotation_range = rotation_range\n        self.width_shift_range = width_shift_range\n        self.height_shift_range = height_shift_range\n        self.shear_range = shear_range\n        self.zoom_range = zoom_range\n        self.channel_shift_range = channel_shift_range\n        self.fill_mode = fill_mode\n        self.cval = cval\n        self.horizontal_flip = horizontal_flip\n        self.vertical_flip = vertical_flip\n        self.rescale = rescale\n        self.preprocessing_function = preprocessing_function\n        self.dtype = dtype\n        self.interpolation_order = interpolation_order\n\n        if data_format not in {\"channels_last\", \"channels_first\"}:\n            raise ValueError(\n                '`data_format` should be `\"channels_last\"` '\n                \"(channel after row and column) or \"\n                '`\"channels_first\"` (channel before row and column). '\n                f\"Received: {data_format}\"\n            )\n        self.data_format = data_format\n        if data_format == \"channels_first\":\n            self.channel_axis = 1\n            self.row_axis = 2\n            self.col_axis = 3\n        if data_format == \"channels_last\":\n            self.channel_axis = 3\n            self.row_axis = 1\n            self.col_axis = 2\n        if validation_split and not 0 < validation_split < 1:\n            raise ValueError(\n                \"`validation_split` must be strictly between 0 and 1. \"\n                f\" Received: {validation_split}\"","sourceCodeStart":987,"sourceCodeEnd":1023,"githubUrl":"https://github.com/keras-team/keras/blob/7a34a03db60bf60042242d6a556fc3be119046a5/keras/src/legacy/preprocessing/image.py#L987-L1023","documentation":"ImageDataGenerator accepts data_format of exactly 'channels_last' or 'channels_first'. The value determines which axis is treated as channels in fit()/transforms.","triggerScenarios":"ImageDataGenerator(data_format='channel_last') (typo), 'NCHW', or a None passed through.","commonSituations":"Copying config from other frameworks (NCHW/NHWC naming); typo'd key in a YAML config.","solutions":["Use 'channels_last' or 'channels_first' literally","Load/verify the value from config: assert data_format in {'channels_last','channels_first'}"],"exampleFix":"// before\nImageDataGenerator(data_format='channel_last')\n// after\nImageDataGenerator(data_format='channels_last')\n","handlingStrategy":"validation","validationCode":"assert data_format in {'channels_last', 'channels_first'}, data_format","typeGuard":"def is_data_format(v): return v in {'channels_last', 'channels_first'}","tryCatchPattern":"try: ImageDataGenerator(data_format=dfmt)\nexcept ValueError as e: if 'data_format' in str(e): dfmt = 'channels_last'","preventionTips":["Validate config keys against the two allowed values at startup"],"tags":["keras","data-format","argument-validation"],"backgroundTag":"invalid-argument-value","analyzedSha":"7a34a03db60bf60042242d6a556fc3be119046a5","analyzedAt":"2026-08-25T21:25:25.994Z","schemaVersion":2},"datasetVersion":"2026-08-26T02:17:13.382Z"}