如何解决这个内存错误的问题?

时间:2018-09-04 12:49:07

标签: keras conv-neural-network

因此,我收到此错误消息,破坏了我的工作的所有乐趣:

Traceback (most recent call last):
  File "C:\Python\Python36\Scripts\Masterarbeit-1308\CNN - Kopie.py", line 97, in <module>
    model.fit(np.asarray(X_train), np.asarray(Y_train), batch_size=32, epochs=100, verbose=1, validation_data=(np.asarray(X_test), np.asarray(Y_test)))
  File "C:\Users\\****\AppData\Roaming\Python\Python36\site-packages\numpy\core\numeric.py", line 492, in asarray
    return array(a, dtype, copy=False, order=order)
MemoryError

有人对此有解决方案吗? 我在具有16 GB RAM的第七代i7机器上工作。

要解释更多,这是我的代码,它需要从声音频谱图转换为.npy并保存在Input-CNN中的所有数组(.npy):

import os, numpy as np
from keras.models import Sequential
from keras.layers import Convolution2D, MaxPooling2D, Activation, Flatten, Conv2D, Dropout, Dense
from keras.layers.normalization import BatchNormalization
import tensorflow as tf
from sklearn.utils import shuffle
from sklearn.cross_validation import train_test_split
from keras.utils import to_categorical

folder = 'D:\InputCNN - Copie'
folder1 = 'C:\Python\Python36\Scripts\Masterarbeit-1308\Data'
from keras import backend as K


My_Data = os.listdir(folder)
num_data= len(My_Data)
Classnames = os.listdir(folder1)
class_num = len(Classnames)
arr =[np.load(os.path.join(folder, filename), fix_imports=True) for filename in os.listdir(folder)]

labels = np.ones((num_data,))
labels[0:31]= 0
labels[31:80] = 1
labels[80:128] = 2
labels[128:131] = 3
labels[131:143] = 4
labels[143:157] = 5
labels[157:209] = 6
labels[209:] = 7
Y = to_categorical(labels,class_num)
x, y = shuffle(arr, Y, random_state=2)
dataset = tf.data.Dataset.from_tensor_slices(My_Data)
X_train, X_test, Y_train, Y_test = train_test_split(x, Y, test_size=0.2)
##
def build_model(idx,X,Y,nb_classes):
    K.set_image_data_format('channels_last')   
    nb_filters = 64  # number of convolutional filters to use
    pool_size = (2, 2)  # size of pooling area for max pooling
    kernel_size = (3, 3)  # convolution kernel size
    nb_layers = 4
    input_shape = (X[idx].shape[1], X[idx].shape[2], X[idx].shape[3])

    model = Sequential()
    model.add(Conv2D(nb_filters, kernel_size, padding='valid', input_shape=input_shape))
    model.add(BatchNormalization(axis=1))
    model.add(Activation('relu'))

    for layer in range(nb_layers-1):
        model.add(Conv2D(nb_filters, kernel_size, padding='valid', input_shape=input_shape))
        model.add(BatchNormalization(axis=1))
        model.add(Activation('relu')) 
        model.add(MaxPooling2D(pool_size=pool_size))
        model.add(Dropout(0.5))

    model.add(Flatten())
    model.add(Dense(128))

    model.add(Activation('relu'))
    model.add(Dropout(0.6))
    model.add(Dense(nb_classes, activation='sigmoid'))
    return model

for idx in range(len(X_train)-1):
 model = build_model(idx,X_train,Y_train, class_num)

model.summary()
model.compile(loss='categorical_crossentropy',
              optimizer='adadelta',
              metrics=['accuracy'])

model.fit(np.array(X_train), np.array(Y_train), batch_size=8, epochs=100, verbose=1, validation_data=(np.array(X_test), np.array(Y_test))) #Here I have the problem
score = model.evaluate(np.array(X_test), np.array(Y_test), verbose=0)
print('Test score:', score[0])
print('Test accuracy:', score[1])

模型拟合函数是我的代码中的问题,应该训练我的预配置模型并返回历史对象(训练的记录)。我尝试了np.array和np.asarray,但得到了相同的错误消息。 如果有人认为该模型的摘要会有所帮助,我将其发布。

1 个答案:

答案 0 :(得分:0)

我解决了这个问题。实际上,我在列表“ X_train”中更改了数据的形状(从(218,128,740,1)更改为(128,740,1))。 我发现,多亏了Keras,它会自动添加另一个轴,并将我的数据注入网络中,并且即使有更多数据,np.asarray也能很好地工作。