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
相关产品推荐
相关产品推荐

