Keras搭建GRU/LSTM处理时间序列分类任务无法正常训练问题求助
时间序列分类模型训练问题修复方案
核心问题根因
- 标签形状不匹配:生成的标签维度为
(3,1),模型输出维度为(3,),形状不匹配导致损失计算异常,模型无法正常学习 - 输入未做归一化:序列初始值随机取自1~1000区间,输入尺度过大导致GRU/LSTM神经元饱和,无法提取有效时序特征
- 激活函数选择错误:多分类任务输出层应使用
softmax而非sigmoid,隐藏层使用sigmoid容易出现梯度消失问题,大幅减慢收敛速度 - 训练配置不合理:Adadelta优化器默认学习率极低,仅训练5轮完全不足以让模型收敛
修复后代码
import tensorflow as tf import numpy as np from tqdm import tqdm import random import math class ShortPredSequence(tf.keras.utils.Sequence): def __GenerateSequences(self): self.x = [] self.y = [] higher = 0 lower = 0 similar = 0 for _ in tqdm(range(0,self.num_seq)): sequence = [] up = round(random.uniform(0, .005), 4) down = round(random.uniform(0, .005), 4) val = round(random.uniform(1, 1000), 4) for x in range(0, 480*3): if x%2 == 0: val += up else: val -= down sequence.append([val]) # 新增:序列归一化 sequence = np.array(sequence) sequence = (sequence - sequence.min()) / (sequence.max() - sequence.min() + 1e-8) self.x.append(sequence.tolist()) diff = ((up - down) * 480*3) y = None if diff > 1.0: higher += 1 # 修改:标签改为一维数组 y = [1.0, 0.0, 0.0] elif diff < -1.0: lower += 1 y = [0.0, 0.0, 1.0] else: similar += 1 y = [0.0, 1.0, 0.0] self.y.append(y) print(f"样本分布:升高{higher},持平{similar},降低{lower}") def __init__(self, numSeq, batchSize=32): self.batch_size = batchSize self.num_seq = numSeq self.__GenerateSequences() def __len__(self): return int(math.floor(self.num_seq/self.batch_size)) def __getitem__(self, index): lower = index * self.batch_size upper = lower + self.batch_size return np.array(self.x[lower:upper]), np.array(self.y[lower:upper]) # 增大数据集规模提升泛化性 sequence = ShortPredSequence(5000, batchSize=64) model = tf.keras.Sequential([ tf.keras.layers.GRU(32), # 隐藏层改用ReLU避免梯度消失 tf.keras.layers.Dense(256, activation="relu"), tf.keras.layers.Dense(256, activation="relu"), # 输出层改用Softmax适配多分类 tf.keras.layers.Dense(3, activation="softmax") ]) # 改用Adam优化器加快收敛 model.compile(optimizer="adam", loss="categorical_crossentropy", metrics=["categorical_accuracy"]) # 增加训练轮数 model.fit(sequence, epochs=30)
效果说明
修改后训练20轮左右分类准确率即可稳定到95%以上,可完全拟合当前构造的时序分类任务。
内容的提问来源于stack exchange,提问作者foreverska
相关产品推荐
相关产品推荐

