Keras执行to_categorical索引越界及CNN结构正确性咨询
报错原因
Keras的to_categorical函数生成独热编码时,要求分类标签从0开始索引。你设置的分类数为6,生成的独热编码数组第二个维度长度为6,合法下标范围是*05*。但你的标签取值为16,标签值6对应下标6超出了数组边界,因此触发越界报错。
修复方案:在调用to_categorical前将所有标签值减1,把标签取值范围调整为0~5即可:
# 放在train_test_split之后、转独热编码之前执行 y_train = y_train - 1 y_test = y_test - 1
CNN网络其余部分的问题
你搭建的网络还有两处明显错误需要修正:
- 输入形状不匹配
你打印的训练数据形状为(850, 100, 1200),但首个卷积层设定的input_shape为(30, 1200, 1),维度完全不匹配。同时CNN输入要求带通道维度,你需要先给数据补充单通道维度,再调整输入形状配置:
# 给训练、测试数据补充单通道维度(对应灰度图) X_train = X_train.reshape(-1, 100, 1200, 1) X_test = X_test.reshape(-1, 100, 1200, 1) # 调整首个卷积层的input_shape参数 model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(100, 1200, 1)))
- 输出层缺少softmax激活
你使用categorical_crossentropy作为多分类损失,要求输出层输出各类别的概率值,必须给最后一个全连接层添加softmax激活函数:
model.add(layers.Dense(num_classes, activation='softmax'))
以上两处修正完成后,网络即可正常训练。
内容的提问来源于stack exchange,提问作者Adler Müller
相关产品推荐
相关产品推荐

