Matlab2022a调用fasterRCNNLayers基于自定义网络构建Faster R-CNN报错咨询
报错根因
触发Layer 'fc' does not exist报错的核心原因有两个:
- 层名不匹配:自定义网络时仅给全连接层手动设置了
fc名称,其余所有层都未显式命名,MATLAB在网络训练过程中会自动给未命名层分配带序号的规范名称,甚至会调整手动命名层的名称避免冲突,最终训练好的网络中全连接层的实际名称和预设的fc不一致,函数在断开特征层与后续全连接层的连接时找不到对应层,直接触发报错。 - 特征层选择逻辑错误:预设的特征层
relu_2是依赖MATLAB自动命名规则得到的层名,实际网络中该名称对应的层和预期的第二个relu层可能存在偏移,导致函数识别特征层位置错误,后续层查找逻辑完全失效。
自定义网络接入
fasterRCNNLayers的强制规范 - 所有层必须显式设置唯一的
Name属性,绝对不能依赖MATLAB自动生成的层名,避免名称匹配错误。 - 传入的基础网络如果是训练好的分类网络,需要手动剥离最后的
softmaxLayer和classificationLayer分类头,不要直接传入完整的训练后网络对象,避免函数自动剥离层时识别错误。 - 选择的
featureLayer(特征提取层)必须是输出二维特征图的卷积层、ReLU激活层或者池化层,不能是全连接层及之后的层;同时要保证该层的下采样倍率和设置的anchor尺寸匹配:特征层相对于输入图像的总步长*特征图上anchor的尺寸,要和输入图上预设的anchor尺寸一致。 - 调用函数时传入的
numClasses填写实际要检测的目标类别数即可,函数内部会自动添加背景类,不需要手动加1。 - 基础网络的输入通道数要和
inputImageSize的通道数一致(比如单通道灰度图对应通道数1,RGB图对应通道数3),函数内部会自动调整输入层的宽高尺寸适配检测任务,不需要和原分类网络的输入尺寸完全一致。
可直接运行的修复代码
首先修改自定义分类网络的层定义,给所有层显式命名:
% cup_use_net_h.m 中网络层定义部分修改为 layers = [ ... imageInputLayer([180 60 1],'Name','input') convolution2dLayer(5,40,'Name','conv1') reluLayer('Name','relu1') maxPooling2dLayer(2,'Stride',2,'Name','maxpool1') convolution2dLayer(5,10,'Name','conv2') reluLayer('Name','relu2') maxPooling2dLayer(5,'Stride',5,'Name','maxpool2') fullyConnectedLayer(2,'Name','fc') softmaxLayer('Name','softmax') classificationLayer('Name','classoutput')];
然后修改Faster R-CNN构建代码,调整特征层、处理传入的基础网络:
% cup_faster_rcnn_c.m 修改为 load("cup_single_mark_net.mat"); % 取出训练好的网络层,手动剥离最后两层分类头 baseLayers = net.Layers(1:end-2); inputImageSize = [450,400,1]; % 选择maxpool2作为特征层,该层总下采样步长为2*5=10,和anchor尺寸匹配 featureLayer = 'maxpool2'; anchorBoxes = [180,60; 150,50]; numClasses = 2; lgraph = fasterRCNNLayers(inputImageSize,numClasses,anchorBoxes, ... baseLayers,featureLayer) analyzeNetwork(lgraph);
注意:如果修改后仍然报错,可以先执行
analyzeNetwork(net)查看训练好的网络所有层的实际名称,确认层名和填写的参数完全一致再运行。
内容的提问来源于stack exchange,提问作者Chen Yu
相关产品推荐
相关产品推荐

