Keras выдаёт ошибку выделения памяти и работает очень медленно - PullRequest
0 голосов
/ 08 декабря 2018

Я работаю над распознаванием символов с помощью сверточных нейронных сетей.У меня 9-слойная модель, 19990 тренировочных данных и 4470 тестовых данных.Но когда я использую кераты с бэкэндом Tensorflow.Когда я пытаюсь тренировать модель, она работает очень медленно, примерно 100-200 образцов в минуту.Я попытался добавить слой пакетной нормализации после выравнивания, используя регуляризацию, добавив выпадающие слои, используя fit_generator для загрузки данных с диска в пакетном режиме, чтобы оперативная память оставалась свободной (что дало худшую производительность), используя пакеты разных размеров, но ничего не работало.Итак, я попытался уменьшить размер сети до 4 уровней и добавил больше каналов к начальным уровням для увеличения параллельных вычислений, но теперь я начал получать ошибки выделения памяти.Там написано, что выделение какого-то адреса превышает 10%, и вся моя система зависает.Я должен перезагрузить свой ноутбук каждый раз.Я попытался вернуться к более ранней версии с 9 слоями, но теперь она дает мне ту же ошибку, хотя она работала и раньше (не очень работала, но, по крайней мере, начала тренироваться).Итак, каково решение этой проблемы?Проблема в том, что аппаратное обеспечение менее способно или что-то еще?У меня 8 ГБ оперативной памяти и 2 ГБ GPU, но я не использую GPU для обучения.У меня процессор Intel i5 7gen.

Код моей модели:

model = Sequential()

#First conv layer
model.add(Conv2D(512,(3,3),padding="same",kernel_initializer="glorot_normal",data_format="channels_last",input_shape=(278,278,1),kernel_regularizer=l1(0.04),activity_regularizer=l2(0.05)))
model.add(LeakyReLU())
model.add(MaxPool2D(pool_size=(2,2),padding="same",data_format="channels_last"))
model.add(Dropout(0.2))

#Second conv layer
model.add(Conv2D(256,(4,4),padding="same",kernel_initializer="glorot_normal",data_format="channels_last",kernel_regularizer=l1(0.02),activity_regularizer=l1(0.04)))
model.add(LeakyReLU())
model.add(MaxPool2D(pool_size=(2,2),strides=2,padding="same",data_format="channels_last"))
model.add(Dropout(0.2))


#Third conv layer
model.add(Conv2D(64,(3,3),padding="same",kernel_initializer="glorot_normal",data_format="channels_last",bias_regularizer=l1_l2(l1=0.02,l2=0.02),activity_regularizer=l2(0.04)))
model.add(LeakyReLU())
model.add(MaxPool2D(pool_size=(2,2),padding="same",data_format="channels_last"))


#Fourth conv layer
model.add(Conv2D(512,(3,3),padding="same",kernel_initializer="glorot_normal",data_format="channels_last",kernel_regularizer=l2(0.04),bias_regularizer=l1(0.02),activity_regularizer=l1_l2(l1=0.04,l2=0.04)))
model.add(LeakyReLU())
model.add(MaxPool2D(pool_size=(2,2),padding="same",data_format="channels_last"))
model.add(Dropout(0.1))


#Fifth conv layer
#model.add(Conv2D(64,(3,3),padding="same",kernel_initializer="glorot_normal",data_format="channels_last"))
# model.add(LeakyReLU())
# model.add(MaxPool2D(pool_size=(2,2),strides=2,padding="same",data_format="channels_last"))

#Sixth conv layer
#model.add(Conv2D(256,(3,3),padding="same",kernel_initializer="glorot_normal",data_format="channels_last"))
#model.add(LeakyReLU())
#model.add(MaxPool2D(pool_size=(2,2),strides=2,padding="same",data_format="channels_last"))
#model.add(Dropout(0.2))


#Seventh conv layer
#model.add(Conv2D(64,(1,1),padding="same",kernel_initializer="glorot_normal",data_format="channels_last"))
 #model.add(LeakyReLU())
 #model.add(Dropout(0.1))


#Eighth conv layer
#model.add(Conv2D(1024,(3,3),padding="same",kernel_initializer="glorot_normal",data_format="channels_last"))
#model.add(LeakyReLU())
#model.add(MaxPool2D(pool_size=(2,2),strides=2,padding="same",data_format="channels_last"))

#Ninth conv layer
#model.add(Conv2D(425,(1,1),padding="same",kernel_initializer="glorot_normal",data_format="channels_last"))
#model.add(LeakyReLU())
# model.add(MaxPool2D(pool_size=(2,2),strides=2,padding="same",data_format="channels_last"))


#Flatten
model.add(Flatten())

#Batch normalization
model.add(BatchNormalization(axis=1))

#Fullyconnected
model.add(Dense(27,activation="softmax"))



#Compile model
adm = Adam(lr=0.2,decay=0.0002)
model.compile(optimizer=adm,loss="categorical_crossentropy",metrics=['accuracy'])
#train_generator = Generator("dataset.h5",batch_size)
#test_generator = Generator("test_dataset.h5",batch_size)
history = model.fit_generator(generator = train_generator,epochs = epochs,steps_per_epoch=19990/batch_size,validation_data=test_generator,validation_steps=4470/batch_size)

Способ загрузки данных:

def Generator(hdf5_file,batch_size):
X = HDF5Matrix(hdf5_file,"/Data/X")
Y = HDF5Matrix(hdf5_file,"/Data/Y")

size = X.end
idx = 0

while True:
    last_batch = idx+batch_size >size
    end = idx + batch_size if not last_batch else size
    yield X[idx:end],Y[idx:end]
    idx = end if not last_batch else 0

Ответы [ 2 ]

0 голосов
/ 25 декабря 2018

У меня проблема.У меня было слишком много параметров в модели.Я пытался уменьшить нет.каналов и все заработало.Я думал об этом, потому что получал ошибку даже для небольшого набора данных.

0 голосов
/ 08 декабря 2018

Я думаю (по крайней мере) одна из ваших проблем в том, что вы загружаете весь свой набор данных в оперативную память.Ваш набор данных (обучение и проверка), кажется, по крайней мере 5 ГБ.и в ваших генераторах вы загружаете их все.Так что в вашем случае это кажется проблемой во время тренировки из-за 8 Гб оперативной памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...