训练神经网络时资源耗尽-Keras

1 machine-learning neural-network deep-learning keras tensorflow

我有65668个文件的数据集。

我将Keras用于CNN,这些是我的图层:

embedding_layer = Embedding(len(word_index) + 1,
                        EMBEDDING_DIM,
                        weights=[embedding_matrix],
                        input_length=MAX_SEQUENCE_LENGTH,
                        trainable=True)
sequence_input = Input(shape=(MAX_SEQUENCE_LENGTH,), dtype='int32')
embedded_sequences = embedding_layer(sequence_input)
x = Conv1D(128, 5, activation='relu')(embedded_sequences)
x = MaxPooling1D(5)(x)
x = Conv1D(256, 5, activation='relu')(x)
x = MaxPooling1D(5)(x)
x = Flatten()(x)
x = Dense(128, activation='relu')(x)
preds = Dense(len(labels_index), activation='softmax')(x)
Run Code Online (Sandbox Code Playgroud)

第一嵌入层在GloVE.6B.100d上训练。拟合数据:

# fitting the data
model.fit(x_train, y_train, validation_data=(x_val, y_val),
      epochs=20, batch_size=128)
Run Code Online (Sandbox Code Playgroud)

MAX_SEQUENCE_LENGTH是500,我在GPU的NVIDIA GeForce 940MX训练,我得到以下错误的堆栈的一部分:

资源耗尽:分配具有形状的张量[15318793,100]并在/ job:localhost / replica:0 / task:0 / device:GPU:0上通过分配器GPU_0_bfc输入float

我尝试将批处理大小减小到16,甚至8,但仍然出现相同的错误。问题可能是什么?

Mar*_*jko 7

问题出在你Embedding。它需要分配一个15318793 * 100 * 4 bytes = 5.7 GB肯定大于GeForce 940 MX内存的大小矩阵。有几种方法可以解决此问题:

  1. 减少词汇/语料库的大小:尝试采用例如1M最常用的单词而不是完整的单词集。这将大大减少嵌入矩阵的大小。

  2. 使用生成器代替EmbeddingEmbedding可以使用生成器将序列转换为单词向量序列,而不是使用生成器

  3. 使用的线性变换,Embedding而不是重新训练您的嵌入 -正如您提到的那样,使用标志trainable=False可使您的算法正常工作,您可以将其设置为False并添加:

    Dense(new_embedding_size, activation='linear')(embedding)
    
    Run Code Online (Sandbox Code Playgroud)

    训练基于现有嵌入的新嵌入。

  4. 更换设备 -如果您有足够的RAM内存,可以尝试以下策略:

    with tf.device('/cpu:0'):    
        embedding_layer = Embedding(len(word_index) + 1,
            EMBEDDING_DIM,
            weights=[embedding_matrix],
            input_length=MAX_SEQUENCE_LENGTH,
            trainable=True)
        sequence_input = Input(shape=(MAX_SEQUENCE_LENGTH,), dtype='int32')
        embedded_sequences = embedding_layer(sequence_input)
    
    Run Code Online (Sandbox Code Playgroud)

    在这种设计中,Embedding层的计算将使用CPU和进行RAM。不利的一面是,RAM和之间的转移GPU可能确实很慢。