iron_man8 2024-04-28 21:20 采纳率: 0%
浏览 10
已结题

为什么我运行这个网络会出现以下报错?CRNN神经网络

为什么我运行这个网络会出现以下报错?


%%
layers = [
    imageInputLayer([249, 13, 3], 'Name', 'input')

    convolution2dLayer(3, 32, 'Padding', 'same', 'Name', 'conv_1')
    batchNormalizationLayer('Name', 'bn_1')
    reluLayer('Name', 'relu_1')
    maxPooling2dLayer(2, 'Stride', 2, 'Name', 'maxpool_1')
    dropoutLayer(0.25, 'Name', 'dropout_1')

    convolution2dLayer(3, 32, 'Padding', 'same', 'Name', 'conv_2')
    batchNormalizationLayer('Name', 'bn_2')
    reluLayer('Name', 'relu_2')
    maxPooling2dLayer(2, 'Stride', 2, 'Name', 'maxpool_2')
    dropoutLayer(0.25, 'Name', 'dropout_2')

    convolution2dLayer(3, 64, 'Padding', 'same', 'Name', 'conv_3')
    batchNormalizationLayer('Name', 'bn_3')
    reluLayer('Name', 'relu_3')
    maxPooling2dLayer(2, 'Stride', 2, 'Name', 'maxpool_3')
    dropoutLayer(0.25, 'Name', 'dropout_3')

    sequenceFoldingLayer('Name', 'fold')
    flattenLayer('Name', 'flatten_before_lstm')
    lstmLayer(64, 'OutputMode', 'sequence', 'Name', 'lstm')
    sequenceUnfoldingLayer('Name', 'unfold')
    flattenLayer('Name', 'flatten_after_lstm')  % Flatten after unfolding to feed into FC
    fullyConnectedLayer(64, 'Name', 'fc')
    reluLayer('Name', 'relu_fc')
    fullyConnectedLayer(2, 'Name', 'fc2')
    softmaxLayer('Name', 'softmax')
    classificationLayer('Name', 'output')
];

错误使用 trainNetwork
无效网络。

出错 MFCCtrain4 (第 120 行)
原因:
层 'fold': 未连接的输出。每个层输出必须连接到另一层的输入。
层 'unfold': 未连接的输入。每个层输入必须连接到另一个层的输出。

  • 写回答

22条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-28 21:21
    关注
    获得0.45元问题酬金

    引自免费微信小程序:皆我百晓生

    从您提供的错误信息来看,问题出在sequenceFoldingLayersequenceUnfoldingLayer这两个层上,它们的输入或输出没有被正确连接到网络中的其他层。在CRNN(卷积循环神经网络)架构中,这些层通常用于处理序列数据,但在MATLAB的深度学习网络定义中,确保层间正确连接是非常关键的。

    解决方案

    为了修正这个问题,我们需要确保sequenceFoldingLayer的输出与后续层(比如LSTM层)的输入相连接,并且sequenceUnfoldingLayer的输入也源自一个有效的层输出。根据您的网络结构,这里是一个修改后的建议:

    1. 移除sequenceFoldingLayersequenceUnfoldingLayer:对于大多数CRNN实现,特别是在MATLAB中,直接将卷积部分的输出连接到LSTM层通常是更直接的做法,而不需要折叠和展开操作。这是因为MATLAB的LSTM层可以直接处理卷积输出的三维张量。

    2. 调整LSTM层的输入维度:由于去除了折叠层,直接从卷积层到LSTM层的过渡需要确保LSTM层能够接受来自卷积层的合适形状的输入。

    下面是修改后的网络定义示例:

    layers = [
        imageInputLayer([249, 13, 3], 'Name', 'input')
    
        convolution2dLayer(3, 32, 'Padding', 'same', 'Name', 'conv_1')
        batchNormalizationLayer('Name', 'bn_1')
        reluLayer('Name', 'relu_1')
        maxPooling2dLayer(2, 'Stride', 2, 'Name', 'maxpool_1')
        dropoutLayer(0.25, 'Name', 'dropout_1')
    
        convolution2dLayer(3, 32, 'Padding', 'same', 'Name', 'conv_2')
        batchNormalizationLayer('Name', 'bn_2')
        reluLayer('Name', 'relu_2')
        maxPooling2dLayer(2, 'Stride', 2, 'Name', 'maxpool_2')
        dropoutLayer(0.25, 'Name', 'dropout_2')
    
        convolution2dLayer(3, 64, 'Padding', 'same', 'Name', 'conv_3')
        batchNormalizationLayer('Name', 'bn_3')
        reluLayer('Name', 'relu_3')
        maxPooling2dLayer(2, 'Stride', 2, 'Name', 'maxpool_3')
        dropoutLayer(0.25, 'Name', 'dropout_3')
    
        % 修改为直接连接到LSTM,注意可能需要根据实际输出调整LSTM的输入尺寸
        lstmLayer(64, 'InputSize', [sizeAfterLastPool, 64], 'OutputMode', 'sequence', 'Name', 'lstm') % sizeAfterLastPool需要计算或已知
    
        % 剩余层保持不变,但需根据实际情况调整flatten层前的尺寸
        flattenLayer('Name', 'flatten_after_lstm')  % Flatten dimensions before FC, adjust according to LSTM output
        fullyConnectedLayer(64, 'Name', 'fc')
        reluLayer('Name', 'relu_fc')
        fullyConnectedLayer(2, 'Name', 'fc2')
        softmaxLayer('Name', 'softmax')
        classificationLayer('Name', 'output')
    ];
    

    注意事项

    • 在上述代码中,'InputSize', [sizeAfterLastPool, 64]中的sizeAfterLastPool需要根据最后一个最大池化层maxpool_3之后的输出大小手动计算或已知。这代表了LSTM层的输入时间步数(第一个维度)和特征数(第二个维度)。
    • flattenLayer的使用也需要基于LSTM层输出的实际尺寸进行调整。
    • 确保所有层都正确连接,每个层的输出都直接或间接地与下一个层的输入相连。

    按照以上修改,您应该能解决未连接输出和输入的问题,并成功创建并训练网络。如果还有其他疑问或遇到新的问题,请随时告知。

    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 5月6日
  • 创建了问题 4月28日

悬赏问题

  • ¥15 孟德尔随机化结果不一致
  • ¥15 深度学习残差模块模型
  • ¥50 怎么判断同步时序逻辑电路和异步时序逻辑电路
  • ¥15 差动电流二次谐波的含量Matlab计算
  • ¥15 Can/caned 总线错误问题,错误显示控制器要发1,结果总线检测到0
  • ¥15 C#如何调用串口数据
  • ¥15 MATLAB与单片机串口通信
  • ¥15 L76k模块的GPS的使用
  • ¥15 请帮我看一看数电项目如何设计
  • ¥23 (标签-bug|关键词-密码错误加密)