Keras深度学习文本分类调用texts_to_matrix触发MemoryError内存不足
报错核心原因
这个MemoryError的根源是Tokenizer参数配置不合理导致的维度爆炸:
你初始化Tokenizer时设置了num_words=None,等于要求Keras把语料中出现的全部252377个不同词汇都作为特征列,最终生成的向量矩阵维度是23162(训练样本数) × 252377(总词数),默认用float64存储时,单个矩阵就需要占用43.6GiB内存,远超普通设备的内存承载能力。哪怕你的原始文本数据集只有20多MB,one-hot向量化的维度膨胀特性也会直接把内存占用拉到极高水平。
另外你代码里的几个额外问题会进一步放大内存压力:
- 重复执行了两次
x_train = tokenizer.texts_to_matrix(train_posts),无意义重复生成大数组 - 导入写法错误,
import tf不是TensorFlow的标准导入方式,正确写法为import tensorflow as tf - 没有特殊需求的话
lower=False会把同一个词的大小写变体(比如"Cat"和"cat")判定为不同词汇,进一步扩大词表规模,拉高矩阵维度
可落地的修复方案
- 限制词表大小,直接砍掉冗余维度
文本分类任务不需要所有出现过的罕见词都作为特征,只保留出现频率最高的前N个高频词即可,通常取10000~50000就能满足绝大多数场景需求。把Tokenizer初始化代码改成如下形式:
改完后单矩阵的维度会直接降到# 保留出现频率最高的前20000个词,其余低频词直接丢弃 tokenizer = Tokenizer(num_words=20000, lower=True)23162 × 20000,内存占用直接压缩到原来的1/10,完全不会触发内存不足报错。 - 删除冗余代码
把最后一行重复调用的x_train = tokenizer.texts_to_matrix(train_posts)删掉,避免无意义的内存浪费。 - 可选优化:降低向量存储精度
如果确实需要保留更多词,可以把向量的存储类型从默认的float64改成float32,内存占用直接减半。texts_to_matrix支持直接传入dtype参数,修改后代码为:x_train = tokenizer.texts_to_matrix(train_posts, dtype='float32') x_test = tokenizer.texts_to_matrix(test_posts, dtype='float32') - 长期优化建议
做深度学习文本分类时,不推荐用texts_to_matrix生成全量稀疏的词频/one-hot矩阵,更省内存的方案是先通过texts_to_sequences把文本转成整数序列,再用pad_sequences补成固定长度的定长序列,直接接入Embedding层训练,内存占用会比当前方案低几个数量级。
内容的提问来源于stack exchange,提问作者FarahAlaa
相关产品推荐
相关产品推荐

