训练神经网络模型时出现SIGKILL内存错误该如何修复?
问题核心原因
触发SIGKILL的根本原因是输入形状设置错误,导致模型参数量异常膨胀耗尽内存:
你传入Flatten层的input_shape=datax.shape包含了样本数维度(也就是shape的第一个值,你取了5个样本,所以datax.shape第一个元素是5),而Keras的输入层input_shape不需要传入batch维度,只需要定义单个样本的形状。错误的输入形状会让后续全连接层(Dense)的参数量比预期大上百倍甚至千倍,哪怕只用5个样本也会直接占满内存。
解决步骤
- 修正输入层形状设置
将Flatten层的参数修改为:Flatten(input_shape=datax.shape[1:])datax.shape[1:]会去掉第一个样本数维度,仅传入单个样本的维度。 - 对齐标签与输出层形状
你当前的输出层是Dense(2),对应单样本输出2个二分类结果,而你的datay是三维结构,需要确认维度匹配,多余维度可以用squeeze压缩:datay = np.load(f)[:5, :, :].squeeze() - 验证模型参数量
在model.compile()之后加一行model.summary()打印模型结构,确认总参数量在合理范围,一般非特大模型参数量不会超过1e7,要是看到参数量超过1e9就说明维度仍然设置错误。
修正后完整可运行代码示例
import gzip import numpy as np from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Flatten, Dense from tensorflow.keras.optimizers import Adam f = gzip.GzipFile('Data_x.npy.gz', "r") datax = np.load(f)[:5, :, :] f.close() f = gzip.GzipFile('Data_y.npy.gz', "r") datay = np.load(f)[:5, :, :].squeeze() f.close() f = None model = Sequential( [ #Conv1D(32, 3, input_shape=datax.shape[1:], activation="relu"), Flatten(input_shape=datax.shape[1:]), Dense(750, activation='relu'), Dense(750, activation='relu'), Dense(2, activation='sigmoid') ] ) model.summary() # 可查看参数量是否正常 model.compile(optimizer=Adam(learning_rate=0.1), loss="binary_crossentropy", metrics=['accuracy']) model1 = model.fit(x=datax, y=datay, batch_size=5, epochs=5, shuffle=True, verbose=2)
内容的提问来源于stack exchange,提问作者Kookies
相关产品推荐
相关产品推荐

