Есть ли способ сделать CNN более эффективным - PullRequest
0 голосов
/ 16 февраля 2020

Я занимаюсь проектом Steganalysis и использую CNN для классификации изображений. Выбранный набор данных - iStego100K. Он имеет 100 000 изображений в формате ST go, 100 000 изображений обложек и 8104 тестовых изображения. В настоящее время я запускаю его на Google Colab. Я хотел бы получить обратную связь по коду, который я использую, и если будут какие-либо улучшения. Моя точность в настоящее время составляет 60. Я также хотел бы знать, как улучшить это значение.

from __future__ import absolute_import, division, print_function, unicode_literals
%tensorflow_version 2.x
import tensorflow as tf

from tensorflow.keras import datasets, layers, models
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

import keras
from keras.layers import Input, Lambda, Dense, Flatten
from keras.models import Model
from keras.preprocessing import image
from keras.preprocessing.image import ImageDataGenerator
from keras.models import Sequential

train_path = "/content/drive/My Drive/train" 
vaild_path = "/content/drive/My Drive/test"
stego_path = '/content/drive/My Drive/train/stego'
cover_path = '/content/drive/My Drive/train/cover'

IMAGE_SIZE = [512,512]

model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(512,512, 1)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(128, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(128, (3, 3), activation='relu'))

model.add(layers.Flatten())
model.add(layers.Dense(128, activation='relu'))
model.add(layers.Dense(2, activation='softmax'))

model.compile(
  loss='categorical_crossentropy',
  optimizer='adam',
  metrics=['accuracy']
)

from keras.preprocessing.image import ImageDataGenerator

train_datagen = ImageDataGenerator(rescale = 1./255,
                                   shear_range = 0.2,
                                   zoom_range = 0.2,
                                   horizontal_flip = True)

test_datagen = ImageDataGenerator(rescale = 1./255)

training_set = train_datagen.flow_from_directory('/content/drive/My Drive/train',             
                                                  target_size = (512, 512),
                                                  color_mode = 'grayscale',
                                                  batch_size = 32,
                                                  class_mode = 'categorical')

test_set = test_datagen.flow_from_directory('/content/drive/My Drive/test',
                                            target_size = (512, 512),
                                            color_mode = 'grayscale',
                                            batch_size = 32,
                                            class_mode = 'categorical')

r = model.fit_generator(
  training_set,
  validation_data=test_set,
  epochs=5,
  steps_per_epoch=len(training_set),
  validation_steps=len(test_set)
)

plt.plot(r.history['acc'], label='train acc')vc
plt.plot(r.history['val_acc'], label='val acc')
plt.legend()
plt.show()
plt.savefig('AccVal_acc')

1 Ответ

0 голосов
/ 17 февраля 2020

Для начала, если у вас есть так много изображений, тогда вы должны go на моделях imag enet и установить обучаемость для нижних уровней True. Поскольку у вас очень много изображений, он может оптимизировать параметры и помочь моделировать функции нижних уровней, адаптированные к вашему набору данных. Проверьте эту ссылку: Keras Applications. Попробуйте Xceptio nNet, это может помочь.

Затем попробуйте переписать модель и применить регуляризации по одной за раз. Например, выбывание, групповой прием, креативные методы увеличения данных.

Вы также можете попробовать прогрессивный размер изображения для обучения сети. Прочтите этот пост: Link Затем вы можете перейти даже в сиамскую или триплетную сеть, вам может не понадобиться такое большое количество изображений, чтобы изучить пространство функций обоих классов.

...