Моя цель - создать модель с TensorFlow для сортировки счета-фактуры и квитанции, сделать литературную модель классификации документов, но я пытаюсь подготовить модель предварительного обучения (точную настройку и нет) и создать свою собственную модель(CNN), но у меня все еще есть та же самая проблема ..., в конце после обучения, когда я пытаюсь предсказать некоторый новый документ с моей моделью, у меня только один результат invoice
..., и мой вопрос,почему?
Почему у меня есть только один результат, когда я прогнозирую новые данные?
Я тренируюсь с 1000 фотографиями каждого для своего счета и квитанции и 3 группами training
, validation
и test
Мои данные - это фотография, полученная смартфоном от реальных пользователей, я так редко сканирую счет-фактуру или квитанцию.
Теперь я думаю, что моя фотография недостаточно хороша, или, возможно, я не могу сделатьэто по распознаванию изображений, скажите мне, если это возможно, с такими вещами или более сильным старым OCR с ~ 100 if
более хорошим: D
Мой основной код для обучения предварительно обученной модели от Google:
...
base_dir, _ = os.path.splitext(rootDir)
image_size = 224
batch_size = 5
batch_size_test = 1
test_datagen = keras.preprocessing.image.ImageDataGenerator(rescale=1./255)
train_generator = test_datagen.flow_from_directory(
train_dir, # Source directory for the training images
target_size=(image_size, image_size),
batch_size=batch_size,
class_mode='binary')
validation_generator = test_datagen.flow_from_directory(
validation_dir, # Source directory for the validation images
target_size=(image_size, image_size),
batch_size=batch_size,
class_mode='binary')
test_generator = test_datagen.flow_from_directory(
test_dir, # Source directory for the test images
target_size=(image_size, image_size),
batch_size=batch_size_test,
class_mode=None)
IMG_SHAPE = (image_size, image_size, 3)
# I also try with pre-trained model: resnet50, InceptionResNetV2
base_model = tf.keras.applications.MobileNetV2(input_shape=IMG_SHAPE,
include_top=False,
weights='imagenet')
base_model.trainable = False
model = tf.keras.Sequential([
base_model,
keras.layers.GlobalAveragePooling2D(),
keras.layers.Dense(1, activation='sigmoid')
])
model.compile(optimizer=tf.keras.optimizers.RMSprop(lr=0.0001),
loss='binary_crossentropy',
metrics=['accuracy'])
epochs = 10
steps_per_epoch = train_generator.n
validation_steps = validation_generator.n
history = model.fit_generator(train_generator,
steps_per_epoch=steps_per_epoch,
epochs=epochs,
workers=4,
validation_data=validation_generator,
validation_steps=validation_steps)
# save all model
model.save('my_model.h5')
# evaluate model
loss2, acc2 = model.evaluate(test_generator, steps=batch_size_test, workers=4)
print("Model, accuracy: {:5.2f}%".format(100*acc2))
print("Model, loss: {:5.2f}%".format(100*loss2))
# For activate fine tuning
# base_model.trainable = True
# fine_tune_at = 100
# for layer in base_model.layers[:fine_tune_at]:
# layer.trainable = False
# model.compile(optimizer = tf.keras.optimizers.RMSprop(lr=2e-5),
# loss='binary_crossentropy',
# metrics=['accuracy'])
# history_fine = model.fit_generator(train_generator,
# steps_per_epoch = steps_per_epoch,
# epochs=epochs,
# workers=4,
# validation_data=validation_generator,
# validation_steps=validation_steps)
Моя собственная модель:
...
batch_size = 5
epochs = 10
img_height = 900
img_width = 680
...
base_dir, _ = os.path.splitext(rootDir)
train_dir = os.path.join(base_dir, 'train')
valid_dir = os.path.join(base_dir, 'validation')
train_invoice_dir = os.path.join(train_dir, 'Invoice')
train_receipt_dir = os.path.join(train_dir, 'Receipt')
validation_invoice_dir = os.path.join(valid_dir, 'Invoice')
validation_receipt_dir = os.path.join(valid_dir, 'Receipt')
num_invoice_tr = len(os.listdir(train_invoice_dir))
num_receipt_tr = len(os.listdir(train_receipt_dir))
num_invoice_val = len(os.listdir(validation_invoice_dir))
num_receipt_val = len(os.listdir(validation_receipt_dir))
total_train = num_invoice_tr + num_receipt_tr
total_val = num_invoice_val + num_receipt_val
test_datagen = ImageDataGenerator(rescale=1./255)
train_generator = test_datagen.flow_from_directory(
directory=train_dir,
shuffle=True,
target_size=(img_height, img_width),
batch_size=batch_size,
class_mode='binary')
valid_generator = test_datagen.flow_from_directory(
directory=valid_dir,
target_size=(img_height, img_width),
batch_size=batch_size,
class_mode='binary')
model = Sequential([
Conv2D(16, 3, padding='same', activation='relu', input_shape=(img_height, img_width, 3)),
MaxPooling2D(),
Dropout(0.2),
Conv2D(32, 3, padding='same', activation='relu'),
MaxPooling2D(),
Conv2D(64, 3, padding='same', activation='relu'),
MaxPooling2D(),
Dropout(0.2),
Flatten(),
Dense(512, activation='relu'),
Dense(1, activation='sigmoid')
])
model.compile(optimizer='adam',
loss='binary_crossentropy',
metrics=['accuracy'])
history = model.fit_generator(train_generator,
steps_per_epoch=total_train,
epochs=epochs,
workers=4,
validation_data=valid_generator,
validation_steps=total_val,
)
model.save("my_model_cnn_fine_tune.h5")
Я также иногда меняю bash_size
, я пытаюсь 100
или 50
в зависимости от модели, я использую, потому что я получил OOM ...
I 'Я начинающий в ML и глубоких знаниях, пожалуйста, прости меня, если я сделал большую ошибку, или мисс что-то понял:)
Заранее спасибо