Matlab调用replaceLayer函数报参数错误或缺失问题求助
Matlab replaceLayer替换网络层报错解决
问题现象
尝试替换网络中的全连接层时,调用replaceLayer函数触发参数类型错误,报错内容为:
Check for incorrect argument data type or missing argument in call to function 'replaceLayer'.
调用信息
使用的调用代码如下:
lgraph = replaceLayer(lgraph,name,layer);
传入参数详情:
- 第一个参数
lgraph:DAGNetwork对象,属性如下
DAGNetwork with properties: Layers: [144×1 nnet.cnn.layer.Layer] Connections: [170×2 table] InputNames: {'data'} OutputNames: {'classoutput'}
- 第二个参数
name:字符串'fc',对应原网络中待替换的全连接层名称 - 第三个参数
layer:自定义初始化的全连接层对象,属性如下
layer = FullyConnectedLayer with properties: Name: 'fc' Hyperparameters InputSize: 720 OutputSize: 8 Learnable Parameters Weights: [8×720 double] Bias: [8×1 double]
已尝试操作
- 采用默认权重初始化方式,确保新层的权重属性非空
- 匹配新旧全连接层的输出维度,保证二者输出数量一致
以上操作均未解决报错,官方论坛未检索到对应解决方案。
根因分析
报错核心原因是第一个入参类型不匹配:replaceLayer是LayerGraph(层图)类的成员方法,仅支持接收LayerGraph类型的可编辑层图对象作为入参;当前传入的lgraph是DAGNetwork类型的已构建网络对象,不属于该方法支持的入参类型,直接调用就会触发参数校验错误,和层的维度、权重初始化没有关系。
修复方法
- 先将DAGNetwork对象转换为可编辑的LayerGraph对象:
% 把已构建的DAG网络转为可编辑的层图结构 lgraph = layerGraph(lgraph);
- 再执行层替换操作:
% 替换指定名称的全连接层 lgraph = replaceLayer(lgraph, 'fc', layer);
- 替换完成后可执行网络连通性校验,确认层连接、维度匹配无问题:
analyzeNetwork(lgraph)
校验通过后的层图可直接用于训练、或者重新组装为DAGNetwork对象使用。
补充说明
- DAGNetwork、SeriesNetwork这类已经组装完成的网络对象本身不支持直接编辑层结构,所有增、删、改层的操作都需要先转为LayerGraph对象再执行
- 替换层时不需要提前强制匹配新旧层的输出维度,只要替换完成后相邻层的输入输出维度可对应即可,
analyzeNetwork会自动检测维度不匹配的问题 - 新替换的层可以和原层使用相同名称,不会影响替换操作
内容的提问来源于stack exchange,提问作者beinando
相关产品推荐
相关产品推荐

