Проблема с памятью сверточной нейронной сети в Керасе - PullRequest
0 голосов
/ 04 августа 2020

Я пытаюсь обучить сверточную нейронную сеть для классификации пород собак. Я использую тренировочный набор из более чем 20000 изображений собак. В тренировочном наборе 120 различных пород.

Если я использую небольшое количество пород, например, 15, я могу без проблем дрессировать его. Однако, когда я использую весь набор (120 пород), мой компьютер зависает (я предполагаю, что у него заканчивается память). Вот мой код:

import numpy as np
from keras.models import Sequential
from keras.models import model_from_json
from keras.layers import Dense, Dropout, Activation, Flatten
from keras.layers import Convolution2D, MaxPooling2D
from keras.utils import np_utils
from keras.utils import to_categorical
from matplotlib import pyplot as plt
from PIL import Image
import os

np.random.seed(123)

numberOfBreeds = len(os.listdir('Dogs/Images'))
imageList= []
breedList = []
counter = 0
for breed in os.listdir('Dogs/Images'):
    counter += 1
    for imageFile in os.listdir('Dogs/Images/' + breed):
        newImage = Image.open('Dogs/Images/' + breed + '/' + imageFile)
        imageList.append(np.array(newImage.resize((200, 200))))
        breedList.append(counter - 1)

imagesForTraining = np.stack(imageList, 0)
imagesForTraining = imagesForTraining.astype('float32')
imagesForTraining /= 255
breedsForTraining = to_categorical(breedList, numberOfBreeds)

model = Sequential()
model.add(Convolution2D(32, 3, 3, activation = 'relu', input_shape=(200, 200, 3)))
model.add(Convolution2D(32, 3, 3, activation = 'relu'))
model.add(MaxPooling2D(pool_size = (2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(numberOfBreeds, activation='softmax'))

model.compile(loss = 'categorical_crossentropy', optimizer = 'adam', metrics = ['accuracy'])
model.fit(imagesForTraining, breedsForTraining, batch_size = 32, epochs = 10, verbose = 1)

model_json = model.to_json()
with open('model.json', 'w') as json_file:
    json_file.write(model_json)
model.save_weights('model.h5')

У меня 2 вопроса:

1- Как уменьшить использование памяти, сохранив количество пород равным 120?

2- Есть ли способ посчитать, сколько памяти будет использовать программа?

...