You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Keras中使用生成器函数构建指定LSTM模型的方法咨询

实现你的Keras LSTM模型 + 生成器指南

嘿,刚接触Keras的话完全不用紧张,我一步步带你搞定这个需求,从模型构建到生成器写法,再到训练,都给你讲清楚~

一、先搞定模型构建

首先明确几个关键点:

  • 你的输入维度是(16,48,12),其中16是批量大小,所以定义模型时,我们只需要指定单样本的形状:(48,12)(48是时间步长度,12是每个时间步的特征数),Keras会自动处理批量维度。
  • 你需要100个单元的LSTM层,输出层是带softmax的Dense层,对应2个类别(因为生成器输出是(16,1,2),本质是每个样本对应2个类别概率)。

基础模型结构(匹配单样本输出)

如果你的需求是整个序列对应一个预测结果,模型可以这么写:

from keras.models import Sequential
from keras.layers import LSTM, Dense

# 初始化序贯模型
model = Sequential()

# 添加LSTM层:100个单元,输入形状是(时间步, 特征数)
model.add(LSTM(100, input_shape=(48, 12)))

# 添加输出层:2个神经元,softmax激活(对应2类分类)
model.add(Dense(2, activation='softmax'))

# 编译模型:根据标签类型选损失函数
model.compile(loss='categorical_crossentropy',  # 标签是独热编码用这个;整数标签用'sparse_categorical_crossentropy'
              optimizer='adam',
              metrics=['accuracy'])

# 查看模型结构
model.summary()

适配(16,1,2)输出的调整

如果生成器输出确实是(16,1,2)(多了一个维度),可以在Dense层后加Reshape层匹配形状:

from keras.layers import Reshape
model.add(Dense(2, activation='softmax'))
model.add(Reshape((1, 2)))

二、生成器函数的写法(新手友好版)

生成器的核心是每次批量返回训练数据和标签,而且要写成无限循环(Keras训练时会不断从生成器取数据,直到达到指定epoch步数)。

普通生成器示例

import numpy as np

def data_generator(batch_size=16):
    while True:  # 无限循环,Keras会自动控制停止时机
        # 1. 生成/读取一批数据(这里用随机数据模拟,替换成你的真实数据读取逻辑)
        x_batch = np.random.rand(batch_size, 48, 12)  # 形状(16,48,12)
        y_batch = np.random.randint(0, 2, size=(batch_size, 1, 2))  # 形状(16,1,2),模拟独热编码标签
        
        # 2. 预处理(按需添加:比如归一化、标准化等)
        # x_batch = your_preprocess_function(x_batch)
        
        # 3. 返回一批数据和标签
        yield x_batch, y_batch

更推荐的Sequence类写法

如果你需要更稳定的生成器(支持多线程、避免重复数据),Keras提供的Sequence类比普通生成器更可靠:

from keras.utils import Sequence

class DataSequence(Sequence):
    def __init__(self, data, labels, batch_size=16):
        self.data = data  # 输入数据,形状(N,48,12),N是总样本数
        self.labels = labels  # 标签数据,形状(N,1,2)
        self.batch_size = batch_size

    def __len__(self):
        # 返回每个epoch有多少个batch
        return int(np.ceil(len(self.data) / self.batch_size))

    def __getitem__(self, idx):
        # 返回第idx个batch的数据和标签
        batch_data = self.data[idx * self.batch_size : (idx+1)*self.batch_size]
        batch_labels = self.labels[idx * self.batch_size : (idx+1)*self.batch_size]
        return batch_data, batch_labels

使用时只需实例化即可:

# 模拟数据
data = np.random.rand(1000, 48, 12)  # 1000个样本
labels = np.random.randint(0,2, size=(1000,1,2))

# 实例化生成器
train_generator = DataSequence(data, labels, batch_size=16)

三、用生成器训练模型

不管用哪种生成器,训练代码都很简单:

# 普通生成器的情况
train_gen = data_generator(batch_size=16)
model.fit(train_gen, steps_per_epoch=100, epochs=10)  # steps_per_epoch=总样本数/批量大小,比如1600个样本就是100

# Sequence类的情况
model.fit(train_generator, epochs=10)  # 无需指定steps_per_epoch,Sequence已自动计算

新手易踩坑提醒

  • 输入形状别加批量大小:模型的input_shape只需要(时间步,特征数),批量大小由生成器控制。
  • 普通生成器必须无限循环:一定要加while True,否则训练会中途停止。
  • 损失函数匹配标签类型:独热编码用categorical_crossentropy,整数标签用sparse_categorical_crossentropy。

内容的提问来源于stack exchange,提问作者ThP

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 10:18:02