Почему моя точность обучения (98%) так сильно отличается от точности проверки (32%), даже если оба изображения были получены из одной среды? - PullRequest
0 голосов
/ 04 июля 2019

Я строю классификатор изображений, который классифицирует стопки белых пластиковых стульев на 1–12 (дюжину) классов в зависимости от количества стульев, которые он может видеть в стопке.

Фотография стопки из 1 стула, принадлежащая к 1 классу стульев

Фотография стека из 12 стульев, принадлежащих к 12 классу стульев

У меня есть 4972 изображения (в среднем 350 изображений на класс) в наборе проверочных данных и 7342 изображения (в среднем 550 изображений на класс) в наборе учебных данных.

Я хотел бы знать, почему у моей модели такая большая разница в точности. Кроме того, 550 изображений на класс будет достаточно для обучения классификатора изображений?

Я построил свою модель с нуля и также использовал трансферное обучение (vgg16), но моя точность валидации все еще остается ниже 40%, несмотря на то, что изображения для тестирования и валидации взяты из той же среды.

# linking my links...
data_zip = 'C:/Users/1/Desktop/data_sets'
train_dir = 'C:/Users/1/Desktop/data_sets/train/'
test_dir = 'C:/Users/1/Desktop/data_sets/test'
valid_dir = 'C:/Users/1/Desktop/data_sets/valid/New folder'
print(train_dir)
print(test_dir)
print(data_zip)


# checking connections...
train_names = os.path.exists(train_dir)
test_names = os.path.exists(test_dir)
data_path = os.path.exists(data_zip)
print(train_names)
print(test_names)
print(data_path)


print(train_dir[0:])
print(test_dir[0:])

training_list = os.listdir(train_dir)
test_list = os.listdir(test_dir)

# how many classes?
print("Training: " + str(len(training_list)) + " Classes ")
print("Testing: " + str(len(test_list)) + " Classes ")

# Introducing labels
labels = training_list[0:]
labels_uno = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]


def my_CNN(input_shape=(224,224,3), num_classes=12):

    model = tf.keras.Sequential()

    model.add(tf.keras.layers.Conv2D(5, kernel_size=(3, 3), 
                                    padding='same',
                                    name='image_array', 
                                    input_shape=input_shape,
                                    activation='relu'))

    model.add(tf.keras.layers.BatchNormalization())

    model.add(tf.keras.layers.Conv2D(10, kernel_size=(3, 3), 
                                 padding='same',
                                 strides=(2, 2),
                                 activation='relu'))

    model.add(tf.keras.layers.BatchNormalization())
    model.add(tf.keras.layers.Dropout(.25))
    model.add(tf.keras.layers.Conv2D(16, kernel_size=(3, 3),padding='same', strides=(2, 2), activation='relu'))

    model.add(tf.keras.layers.BatchNormalization())

    model.add(tf.keras.layers.Conv2D(16, kernel_size=(3, 3),padding='same',strides=(2, 2), activation='relu'))

    model.add(tf.keras.layers.BatchNormalization())

    model.add(tf.keras.layers.Dropout(.25))

    model.add(tf.keras.layers.Conv2D(32, kernel_size=(3, 3), padding='same',strides=(2, 2), activation='relu'))

    model.add(tf.keras.layers.BatchNormalization())

    model.add(tf.keras.layers.Conv2D(64, kernel_size=(3, 3),padding='same',strides=(2, 2), activation='relu'))

    model.add(tf.keras.layers.BatchNormalization())
    model.add(tf.keras.layers.Convolution2D(filters=num_classes, 
                                        kernel_size=(3, 3),
                                        strides=(2, 2),
                                        padding='same'))

    model.add(tf.keras.layers.Flatten())
    model.add(tf.keras.layers.Dense(63, activation='relu')),
    model.add(tf.keras.layers.Dense(12,activation='softmax',name='predictions'))

    return model


train_datagen = ImageDataGenerator(rescale=1/255, featurewise_center=False,
                               featurewise_std_normalization=False,
                               rotation_range=5,
                               width_shift_range=0.1,
                               height_shift_range=0.1,
                               zoom_range=.1
                               )

train_generator = train_datagen.flow_from_directory(train_dir,
                                                batch_size=50,
                                                class_mode='categorical',
                                                target_size=(224, 224),
                                                color_mode='rgb',
                                                shuffle=True
                                                )

validation_datagen = ImageDataGenerator(rescale=1./255,
                                    featurewise_center=False,
                                    featurewise_std_normalization=False,
                                    rotation_range=5,
                                    width_shift_range=0.1,
                                    height_shift_range=0.1,
                                    zoom_range=.1)

validation_generator = validation_datagen.flow_from_directory(test_dir,batch_size=40,class_mode='categorical',target_size=(224, 224),
                                            color_mode='rgb',shuffle=True)


model = my_CNN()
model.compile(optimizer=tf.train.AdamOptimizer(learning_rate=0.005),
          loss='categorical_crossentropy',
          metrics=['accuracy'])
model.summary()

history = model.fit_generator(train_generator,
                          epochs=9,
                          verbose=1,
                          validation_data=validation_generator,
                          validation_steps=int(3000/40)
                          )


train_labels = to_categorical(labels_uno, num_classes=12, dtype='int')
print(train_labels)

# printing results
test_image = image.load_img(valid_dir + '/14test.jpg', target_size=(224, 224), color_mode='rgb')

plt.imshow(test_image)
test_image = image.img_to_array(test_image)
test_image = np.expand_dims(test_image, axis=0)
result = model.predict(test_image)
print(result)
print(result[0])
print(result.argmax())

test_image2 = image.load_img(valid_dir + '/13test.jpg', target_size=(224, 224), color_mode='rgb')

plt.imshow(test_image2)
test_image2 = image.img_to_array(test_image2)
test_image2 = np.expand_dims(test_image2, axis=0)
result2 = model.predict(test_image2)
print(result2)
print(result2[0])
print(result2.argmax())

test_image3 = image.load_img(valid_dir + '/1test.jpg', target_size=(224, 224), color_mode='rgb')
plt.imshow(test_image3)
test_image3 = image.img_to_array(test_image3)
test_image3 = np.expand_dims(test_image3, axis=0)
result3 = model.predict(test_image3)
print(result3)

print(result3[0])
print(result3.argmax())

preds = np.round_(result.reshape(12, 1))
preds2 = np.round_(result2.reshape(12, 1))
preds3 = np.round_(result3.reshape(12, 1))
print('rounded test_labels:', preds)
print('rounded test_labels2:', preds2)
print('rounded test_labels3:', preds3)
print('preds_shape:', preds.shape)
print('preds2_shape:', preds2.shape)
print('preds3_shape:', preds3.shape)

classification_metrics = metrics.classification_report(labels_uno, preds, target_names=labels)
classification_metrics2 = metrics.classification_report(labels_uno, preds2, target_names=labels)
classification_metrics3 = metrics.classification_report(labels_uno, preds3, target_names=labels)
print(classification_metrics)
print(classification_metrics2)
print(classification_metrics3)

#These are the last outputs of the 10 Epoches
147/147 [==============================] - 1725s 12s/step - loss: 3.0420 - acc: 0.5726 - val_loss: 3.7351 - val_acc: 0.2750
147/147 [==============================] - 1731s 12s/step - loss: 0.6688 - acc: 0.8062 - val_loss: 4.7904 - val_acc: 0.2440
147/147 [==============================] - 1793s 12s/step - loss: 0.6961 - acc: 0.8180 - val_loss: 5.7115 - val_acc: 0.2910
147/147 [==============================] - 1793s 12s/step - loss: 0.5203 - acc: 0.8680 - val_loss: 6.8262 - val_acc: 0.2337
147/147 [==============================] - 1750s 12s/step - loss: 0.5274 - acc: 0.8697 - val_loss: 7.1189 - val_acc: 0.2803
147/147 [==============================] - 2085s 14s/step - loss: 0.7673 - acc: 0.8511 - val_loss: 7.5080 - val_acc: 0.2700
147/147 [==============================] - 1721s 12s/step - loss: 0.4953 - acc: 0.8936 - val_loss: 6.9290 - val_acc: 0.3057
147/147 [==============================] - 1981s 13s/step - loss: 0.5091 - acc: 0.8912 - val_loss: 7.7346 - val_acc: 0.2787
147/147 [==============================] - 1730s 12s/step - loss: 0.4535 - acc: 0.9042 - val_loss: 8.1851 - val_acc: 0.2883
147/147 [==============================] - 1692s 12s/step - loss: 0.4414 - acc: 0.9100 - val_loss: 10.0667 - val_acc: 0.2497
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...