Я учусь использовать генератор в 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)
Может кто-нибудь помочь, пожалуйста? И также, это правильный способ реализации генератора в целом?
Спасибо!