You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言Keras迁移学习模型输出维度不兼容报错咨询

报错原因
  • 核心原因是损失函数与标签格式不匹配:categorical_crossentropy损失要求输入标签为one-hot编码格式,10分类任务下标签形状需为(样本数, 10);但cifar10数据集加载的原始标签为0-9区间的整数类别编码,形状为(样本数, 1),二者维度无法对齐,因此抛出错误。
  • 模型结构搭建正确,最终输出维度为10符合预期,报错与ResNet101 backbone、网络层拼接逻辑无关。
解决方法

两种方案二选一即可,无需修改现有模型结构:

方案1:转换标签为one-hot编码,保留原有损失函数

在启动训练前,对训练、测试集标签做one-hot编码转换,参考代码如下:

# 指定10个类别,将整数标签转为one-hot格式
train_labels <- to_categorical(train_labels, num_classes = 10)
test_labels <- to_categorical(test_labels, num_classes = 10)

# 校验转换后维度,输出应为(50000, 10)
dim(train_labels)

转换完成后直接运行原有训练代码即可正常启动训练。

方案2:更换损失函数适配整数标签,无需修改标签

不做标签格式转换,直接将模型编译阶段的损失函数替换为原生支持整数类别标签的sparse_categorical_crossentropy,修改后的编译代码如下:

model %>% compile(
  optimizer = "adam",
  loss = "sparse_categorical_crossentropy",
  metrics = "accuracy"
)

该方案流程更简便,是整数标签分类任务的常规选择。

额外优化提示
  • 现有代码直接将0-255取值范围的原始像素值输入ImageNet预训练的ResNet101,会导致训练收敛慢、精度差。预训练权重对应输入需要做专用归一化处理,在输入模型前添加如下预处理步骤即可:
# 调用ResNet101配套的ImageNet输入预处理函数
train_images <- imagenet_preprocess_input(train_images)
test_images <- imagenet_preprocess_input(test_images)
  • CIFAR10图像分辨率仅32x32,经过ResNet101多次下采样后输出特征形状为1x1x2048属于正常现象,后续接Flatten层与全连接层的结构没有逻辑问题。

内容的提问来源于stack exchange,提问作者bmc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 14:18:17