Использование генератора в Python для подачи в Keras model.fit_generator - PullRequest
0 голосов
/ 19 марта 2020

Я учусь использовать генератор в Python и передать его в Keras model.fit_generator.

from keras.utils import to_categorical
from keras.models import Sequential
from keras.layers import Dense, Conv2D, Flatten
import pandas as pd
import os
import cv2

class Generator:
    def __init__(self,path):
        self.path = path

    def gen(self, feat, labels):
        i=0
        while (True):
            im = cv2.imread(feat[i],0)
            im = im.reshape(28,28,1)
            yield im,labels[i]
            i+=1

if __name__ == "__main__":
    input_dir = './mnist'
    output_file = 'dataset.csv'

    filename = []
    label = []
    for root,dirs,files in os.walk(input_dir):
        for file in files:
            full_path = os.path.join(root,file)
            filename.append(full_path)
            label.append(os.path.basename(os.path.dirname(full_path)))

    data = pd.DataFrame(data={'filename': filename, 'label':label})
    data.to_csv(output_file,index=False)

    feat = data.iloc[:,0]
    labels = pd.get_dummies(data.iloc[:,1]).as_matrix()

    image_gen = Generator(input_dir)

    # #create model
    model = Sequential()
    model.add(Conv2D(64, kernel_size=3, activation="relu", input_shape=(28,28,1)))
    model.add(Conv2D(32, kernel_size=3, activation="relu"))
    model.add(Flatten())
    model.add(Dense(2, activation="softmax"))

    model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
    model.fit_generator(image_gen.gen(filename,labels), steps_per_epoch=5 ,epochs=5, verbose=1)

У меня есть 2 подпапки в папке ./mnist, соответствующие каждому классу в моем наборе данных. Я создал Dataframe, который содержит путь каждого изображения и метку (которая является именем соответствующей подпапки).

Я создал Generator класс, который загружает изображение, путь которого записан в DataFrame.

Это дало мне ошибку: ValueError: Error when checking input: expected conv2d_1_input to have 4 dimensions, but got array with shape (28, 28, 1)

Может кто-нибудь помочь, пожалуйста? И также, это правильный способ реализации генератора в целом?

Спасибо!

1 Ответ

0 голосов
/ 19 марта 2020

Я думаю, что ответы на ваши вопросы можно найти в документации Keras.

С точки зрения формы ввода, слои Conv2D ожидают 4-мерного ввода, но вы явно изменили значение (28,28,1) в своем генераторе, так что 3 измерения. Информацию о Conv2D и формат ввода смотрите в этой документации .

Что касается самого генератора, Документация Keras предоставляет пример с генератором, который является функцией, то же самое обсуждается в Python Wiki . Но ваша конкретная реализация, похоже, сработает, по крайней мере, для первой итерации, если вы дойдете до точки подачи данных в слой свертки.

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