• 无效的训练数据。序列响应必须与对应的预测变量具有相同的序列长度。哪里出了问题


    关注 码龄 粉丝数 原力等级 -- 被采纳 被点赞 采纳率 dmountain 2024-03-30 17:14 采纳率: 0% 浏览 54 首页/ 人工智能 / 无效的训练数据。序列响应必须与对应的预测变量具有相同的序列长度。哪里出了问题 深度学习神经网络matlab 无效的训练数据。序列响应必须与对应的预测变量具有相同的序列长度。哪里出了问题。 XrTrain = cell(size(pn_train,2),1); %注意size是1还是2,tn_train是2*4095数组,pn_train是6*4095数组 YrTrain = zeros(size(tn_train,1),4095);%YrTrain是2*4095数组 for i=1:size(pn_train,2)%i是1到4095 XrTrain{i,1} = pn_train(:,i); %pn_train 是6*4095列.Xrtrain是6*1个胞元, YrTrain(:,i) = tn_train(:,i); % YrTrain(:,1)= tn_train(:,i); %每个tn_train是2*1列,tn_train是2*4095 end numFeatures = size(pn_train,1); % 输出特征维度 numResponses = 2; FiltZise = 10; % 创建"CNN-LSTM"模型 layers = [... % 输入特征 sequenceInputLayer([numFeatures 1 1],'Name','input') sequenceFoldingLayer('Name','fold') % CNN特征提取 convolution2dLayer([FiltZise 1],32,'Padding','same','WeightsInitializer','he','Name','conv','DilationFactor',1); batchNormalizationLayer('Name','bn') eluLayer('Name','elu') averagePooling2dLayer(1,'Stride',FiltZise,'Name','pool1') % 展开层 sequenceUnfoldingLayer('Name','unfold') % 平滑层 flattenLayer('Name','flatten') % LSTM特征学习 lstmLayer(128,'Name','lstm1','RecurrentWeightsInitializer','He','InputWeightsInitializer','He') % LSTM输出 lstmLayer(32,'OutputMode',"last",'Name','bil4','RecurrentWeightsInitializer','He','InputWeightsInitializer','He') dropoutLayer(0.25,'Name','drop3') % 全连接层 fullyConnectedLayer(numResponses,'Name','fc') regressionLayer('Name','output') ]; layers = layerGraph(layers); layers = connectLayers(layers,'fold/miniBatchSize','unfold/miniBatchSize'); analyzeNetwork(layers); %补充分析 %% CNNLSTM训练选项 % 批处理样本 MiniBatchSize =24; % 最大迭代次数 MaxEpochs = 60; % 学习率 learningrate = 0.005; % 一些参数调整 if gpuDeviceCount>0 mydevice = 'gpu'; else mydevice = 'cpu'; end options = trainingOptions( 'adam', ... 'MaxEpochs',100, ... 'GradientThreshold',1, ... 'InitialLearnRate',learningrate, ... 'LearnRateSchedule','piecewise', ... 'LearnRateDropPeriod',20, ... 'LearnRateDropFactor',0.8, ... 'L2Regularization',1e-3,... 'Verbose',false, ... 'ExecutionEnvironment',mydevice,... 'Plots','training-progress'); %% 训练混合网络 % rng(0); % 训练 net = trainNetwork(XrTrain,YrTrain,layers,options); 展开全部 收起 写回答 好问题 0 提建议 追加酬金 关注问题 微信扫一扫 点击复制链接 分享 邀请回答 编辑 收藏 删除 结题 收藏 举报 追加酬金 (90%的用户在追加酬金后获得了解决方案) 当前问题酬金 ¥ 0 (可追加 ¥500) ¥ 15¥ 20¥ 50¥ 100¥ 200 支付方式 扫码支付 二维码出错 点击刷新 支付金额 15 元 提供问题酬金的用户不参与问题酬金结算和分配 支付即为同意 《付费问题酬金结算规则》 结题 再想想 删除 再等等

    3条回答 默认 最新

    • 专家-赤兔[在线] 全栈领域优质创作者 2024-03-30 17:14
      关注

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

      在处理一个序列响应与预测变量具有相同序列长度的序列响应问题时,我们需要确保以下几点:

      1. 序列长度:序列响应通常包含一组连续的数字,其每个值都对应着一个预测变量(例如,'Y')的位置。如果我们尝试将这些值映射到原始的X输入矩阵(表示的是样本向量),我们可能会发现某些位置的X是空的或只包含有限个元素,导致length(XrTrain)小于length(YrTrain)

      2. 序列长度:根据上述步骤,序列响应的长度通常是预测变量的行数。如果序列响应的长度不等于预测变量的行数,则这可能意味着我们在构建CNN-LSTM模型时,序列响应被剪切或转换成了单个元素(即Z[i])。这就导致了sequenceLength为1或sequenceLength > length(YrTrain)的情况,从而使得训练数据中的预测变量位于一个序列长度较小的位置上,而序列响应中的其他部分则没有与其对应的需求。

      要解决这个问题,我们可以采取以下策略:

      解决方案一:预处理序列响应

      1. 缺失值填充: 如果序列响应中的某个位置上的所有元素都是空的或只有一个元素,我们可以使用填充技术(例如,零填充、随机填充等)来替换这些空值。在NumPy中,可以使用numpy.nanmean()函数或numpy.random.randn()函数实现这个任务。
      # 填充序列响应
      for i in range(len(XrTrain)):
          if np.isnan(XrTrain[i]):
              XrTrain[i] = np.random.randn()
      
      1. 进行数据缩放: 虽然通过填充已知或期望值可以填补缺失值,但可能对不同的数据集效果不同。因此,对于特征较少的数据集,我们可能希望将其缩放到一个更小的范围内,以便更好地适应模型结构和需求。这里,我们将设置shape(XrTrain),即XrTrain的形状为(XrTrain.shape[0], numFeatures),然后使用arraymap()函数应用一个固定的缩放系数:
      def scale_data(XrTrain):
          scaled_XrTrain = arraymap(lambda x: x / np.max(XrTrain), XrTrain)
          return scaled_XrTrain.reshape(shape(XrTrain))
      
      scaled_XrTrain = scale_data(XrTrain)
      

      解决方案二:正则化预处理

      在CNN-LSTM模型中,正则化是一种防止过拟合的技术,它通过对模型权重进行惩罚,降低复杂度,使模型更容易泛化到未见过的新数据上。在这种情况下,我们可以使用L1正则化或L2正则化来优化输入序列响应的权重,并减少预测变量之间的依赖性:

      1. L1正则化lambda_1 = 0.01:设置一个权重衰减项。在lr参数中设置 1e-4,以使用默认的学习率进行训练。
      options.L1Regularization = 1e-4
      
      # L1正则化训练
      net = trainNetwork(scaled_XrTrain,YrTrain,layers,options)
      
      1. L2正则化lambda_2 = 0.001:设置另一个权重衰减项。在lr参数中设置 1e-6,同样可以使用默认的学习率进行训练。
      options.L2Regularization = 1e-6
      
      # L2正则化训练
      net = trainNetwork(scaled_XrTrain,YrTrain,layers,options)
      

      解决方案三:截断多态解码器(MLP)

      考虑到CNN-LSTM模型结合了LSTM层和卷积神经网络(CNN),如果CNN层采用固定大小的卷积核和隐藏层,当预测变量的宽度不足以覆盖所有的特征时,可能会产生维度变高的情况,导致模型陷入局部最优解并影响性能。为此,我们可以使用多态解码器(MLP)进行数据切片,将序列响应分割成多个较小的片段,然后分别对其进行计算和更新。

      1. 多态解码器架构
        # 设定每个CNN模块的嵌套深度
        max_depth = 2
        
        # 使用递归方式创建多态解码器的嵌套结构
        for depth in range(max_depth):
            net_layers.append([
                feature_extractor_layer,
                recurrent_encoder_layer,
                decoder_layer,
            ])
            feature_extractor_layer = feature_extraction_layer + ('FC', (max_features, ))
            recurrent_encoder_layer = recurrent_encoder_layer + ('FC', (max_features, ))
            decoder_layer = decoder_layer + ('FC', (max_features, ))
            input_layer = sequence_input_layer
        
            for n_in, n_out in zip(input_layer.shape[1:], [
                n_in * feature_extractor_layer.n_features,  # 卷积层输入特征的通道数
                n_in * recurrent_encoder_layer.n_features,  # 隐藏层输入特征的通道数
                n_in * decoder_layer.n_features,  # 隐藏层输出特征的通道数
            ]):
                net_layers[-depth].append(
                    linear_classifier_layer(n_in * max_features, n_out),
                )
        
        # 应用多态解码器至整个模型
        net = multi_tensor_stack(net_layers)
        
        # 在最后一个非编码层添加批次大小校验层
        net = residual_block(net, 'batch_size', 16, activation='relu')
        
        # 构建多层馈送网络
        for n_in, n_out in zip(input_layer.shape[1:], [
            n_in * feature_extractor_layer.n_features,  # 卷积层输入特征的通道数
            n_in * recurrent_encoder_layer.n_features,  # 隐藏层输入特征的通道数
            n_in * decoder_layer.n_features,  # 隐藏层输出特征的通道数
            n_in * dense_layer_n_in,  # 卷积层隐藏层输出特征的通道数
        ]):
            net = add_twooutputs(inputs=[net_layers[-depth][n_in]], outputs=[net[-1][n_in]])
        
        
        # 编译模型
        optimizer = Adam(lr=learningrate)
        loss_function = nn.CrossEntropyLoss()
        criterion = nn.MSELoss()
        
        model = Model(inputs=input_layer, outputs=output_layer, losses=[criterion, loss_function])
        model.compile(optimizer=optimizer, loss=criterion)
        
      
      这段代码定义了一个多层的多态解码器架构,该架构首先使用递归方法(如`feature_extraction_layer`、`recurrent_encoder_layer`和`decoder_layer`)对输入序列响应进行切割,生成几个较小的片段,然后使用MPLP进行每个片段的计算和更新。最后,在编码层添加批次大小校验层,以便在每一帧的序列响应上进行平滑采样,从而得到单个像素级别的预测值。这与传统的CNN-LSTM架构不同,其中序列响应会被分块处理并一次性进行预测,而不是每次更新模型时才进行预测。
      

      展开全部

      评论 编辑记录
    • Kwan的解忧杂货铺 Java领域优质创作者 2024-03-30 17:14
      关注

      下午好🌅🌅🌅
      本答案参考ChatGPT-3.5

      问题出在这里:

      YrTrain(:,i) = tn_train(:,i);
      

      根据你提供的代码,tn_train 是一个 2x4095 的数组,但是 YrTrain 的大小是 2x4095 的数组,所以维度是匹配的。但根据你的错误信息,你得到了一个“无效的训练数据”错误。这可能是因为你的 tn_train 的维度应该是 4095x2。

      解决方案:

      1. 检查 tn_train 的维度,确保它是 4095x2 的数组,而不是 2x4095。
      2. 如果 tn_train 是 2x4095 的数组,那么你需要将它转置为 4095x2 的数组。你可以使用 tn_train = tn_train'; 将其转置。

      修改后的代码:

      for i=1:size(pn_train,2)
          XrTrain{i,1} = pn_train(:,i);
          YrTrain(:,i) = tn_train(:,i);
      end
      

      修改后的代码(转置 tn_train):

      for i=1:size(pn_train,2)
          XrTrain{i,1} = pn_train(:,i);
          YrTrain(:,i) = tn_train(i,:)';
      end
      
      评论 编辑记录
    • CSDN-Ada助手 CSDN-AI 官方账号 2024-03-30 20:21
      关注

      【相关推荐】



      • 你可以看下这个问题的回答https://ask.csdn.net/questions/7462103
      • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:朴素贝叶斯算法,点进来了解了解。
      • 您还可以看一下 王剑老师的站长必修课:网站是怎样做出来的?课程中的 产品设计:计划-蓝图小节, 巩固相关知识点
      • 除此之外, 这篇博客: 百题突击3:1.逻辑回归相比线性回归,有何异同? 2.回归问题常用的性能度量指标 3.分类问题常用的性能度量指标 4.逻辑回归的损失函数中的 2.回归问题常用的性能度量指标 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:

        这三个最常用到:

        SSE、MSE、RMSE
        SSE(残差平方和、和方差、误差平方和):Sum of Squares due to Error

        MSE(均方差、均方误差):Mean Squared Error

        RMSE(均方根误差、标准误差):Root Mean Squared Error

        SSE=∑i=1n(y^i−yi)2MSE=SSEn=1n⋅∑i=1n(y^i−yi)2RMSE=MSE=SSE/n=1n⋅∑i=1n(y^i−yi)2SSE=ni=1(ˆyiyi)2MSE=SSEn=1nni=1(ˆyiyi)2RMSE=MSE=SSE/n=1nni=1(ˆyiyi)2SSE=i=1n(y^iyi)2MSE=nSSE=n1i=1n(y^iyi)2RMSE=MSE=SSE/n=n1i=1n(y^iyi)2

        SSE、SSR、SST、R_square

        SSE(残差平方和、和方差、误差平方和):Sum of Squares due to Error

        SSR(回归平方和):Sum of Squares of the Regression

        SST(总离差平方和):Total Sum of Squares

        R-square(决定系数):Coefficient of Determination

        SSE=∑i=1n(y^i−yi)2SSR=∑i=1n(y^i−yˉ)2SST=∑i=1n(yi−yˉ)2SST=SSE+SSRR2=SSRSST=1−SSESSTSSE=ni=1(ˆyiyi)2SSR=ni=1(ˆyiˉy)2SST=ni=1(yiˉy)2SST=SSE+SSRR2=SSRSST=1SSESSTSSE=i=1n(y^iyi)2SSR=i=1n(y^iyˉ)2SST=i=1n(yiyˉ)2SST=SSE+SSRR2=SSTSSR=1SSTSSE

        MAE:直接计算模型输出与真实值之间的平均绝对误差
        MAPE:不仅考虑预测值与真实值误差,还考虑了误差与真实值之间的比例。
        平均平方百分比误差MASE

        MAE=1n∑i=0n∣f(xi)−yiMAPE=1n∑i=0n∣f(xi)−yi∣yiMASE=1n∑i=0n(∣f(xi)−yi∣yi)2MAE=1nni=0f(xi)yiMAPE=1nni=0|f(xi)yi|yiMASE=1nni=0(|f(xi)yi|yi)2 MAE=n1i=0nf(xi)yiMAPE=n1i=0nyif(xi)yiMASE=n1i=0n(yif(xi)yi)2


      如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

      展开全部

      评论
    编辑
    预览

    报告相同问题?

  • 相关阅读:
    Centos7 升级 Kubernetes(k8s) 集群
    虚幻C+++基础 day2
    前后端分离 基础(新增与查询)
    SSM - Springboot - MyBatis-Plus 全栈体系(十)
    系统篇: linux 下增加交换分区
    常用LaTeX命令
    【DZBS-202/T低电流启动中间继电器】
    sql 11
    全球AI人工智能领袖:Anthropic联合创始人丹妮拉·阿莫迪!
    Codespaces个性化后台服务器配置指南
  • 原文地址:https://ask.csdn.net/questions/8081482