В настоящее время я разрабатываю сверточную нейронную сеть в рамках keras с использованием бэкэнда тензорного потока, который будет использоваться для разграничения пройденного или неудачного индикатора.Разница между ними (определение, является ли это проходом или неудачей) заключается в небольшом изменении цвета внутри трубки.Однако, когда я тренирую сверточную нейронную сеть на изображениях (приблизительно 1500 изображений каждого), сеть, кажется, всегда предсказывает проходы независимо от изображения.Я предполагаю, что это связано с огромным сходством между ними, но я не уверен, почему он не может обнаружить это изменение цвета как отличительную особенность.
Код, который я сейчас использую для построения классификатораниже, чтобы дать представление о том, где классификатор может создавать такое смещение.
# Imports from Keras Library to build Network
from keras.models import Sequential
from keras.layers import Conv2D
from keras.layers import MaxPooling2D
from keras.layers import Flatten
from keras.layers import Dense
from keras.layers import Dropout
from keras.layers import Activation
from keras.callbacks import ModelCheckpoint
from keras.layers import BatchNormalization
# Initialising the CNN as a sequential network
classifier = Sequential()
# Addition of convultional layer
classifier.add(Conv2D(32, kernel_size=(3, 3), input_shape = (356, 356, 3)))
# Adding a dropout to prevent overstabilization on certain nodes
# Adding a second/third/fourth convolutional/pooling/dropout layer
classifier.add(BatchNormalization())
classifier.add(Activation("relu"))
classifier.add(Conv2D(32, (3, 3)))
classifier.add(BatchNormalization())
classifier.add(Activation("relu"))
classifier.add(MaxPooling2D(pool_size = (2, 2)))
classifier.add(Dropout(0.25))
classifier.add(Conv2D(32, (3, 3)))
classifier.add(BatchNormalization())
classifier.add(Activation("relu"))
classifier.add(MaxPooling2D(pool_size = (2, 2)))
classifier.add(Dropout(0.25))
classifier.add(Conv2D(64, (3, 3)))
classifier.add(BatchNormalization())
classifier.add(Activation("relu"))
classifier.add(MaxPooling2D(pool_size = (2, 2)))
classifier.add(Dropout(0.25))
# Flattening Layer
classifier.add(Flatten())
# Full connection using dense layers
classifier.add(Dense(units = 128))
classifier.add(BatchNormalization())
classifier.add(Activation("relu"))
classifier.add(Dense(units = 2, activation = 'softmax'))
# Compiling the CNN
classifier.compile(optimizer = 'adam', loss = 'categorical_crossentropy', metrics = ['accuracy'])
classifier.summary()
# Fitting the CNN to the images
from keras.preprocessing.image import ImageDataGenerator
# Taining image generator (causes variation in how images may appear when trained upon)
train_datagen = ImageDataGenerator(rescale = 1./255,
shear_range = 0.4,
zoom_range = 0.4,
horizontal_flip = True)
test_datagen = ImageDataGenerator(rescale = 1./255)
# Creation of training set
training_set = train_datagen.flow_from_directory('dataset/TrainingSet',
target_size = (356, 356),
batch_size = 32,
class_mode = 'categorical',
shuffle = True)
# Creation of test set
test_set = test_datagen.flow_from_directory('dataset/TestSet',
target_size = (356, 356),
batch_size = 32,
class_mode = 'categorical',
shuffle = True)
caller = ModelCheckpoint('/Users/anishkhanna/Documents/Work/BI Test/BI Models/part3.weights.{epoch:02d}-{val_loss:.2f}.hdf5', monitor='val_loss', verbose=0, save_best_only=False, save_weights_only=False, mode='auto', period=1)
# Training the model based on above set
# Can also be improved with more images
classifier.fit_generator(training_set,
steps_per_epoch = 200,
epochs = 200,
validation_data = test_set,
validation_steps = 15,
shuffle = True,
callbacks = [caller])
# Creates a HDF5 file to save the imformation of the model so it can be used later without retraining
classifier.save('BI_Test_Classifier_model.h5')
# Deletes the existing model
del classifier
Если есть какие-то улучшения в модели, которые я мог бы сделать, или предложения к ней, будет очень признателен.