Python TFLearn CNN предсказывает ВСЕГДА неправильный класс - PullRequest
0 голосов
/ 16 октября 2018

На основе примеров здесь и здесь Я пытаюсь построить классификатор кожи, используя TFLearn.Набор данных здесь .

Сценарий поезда CNN:

# Load the data set
X, Y = image_preloader("train_data", image_shape=(15, 15), mode='folder', categorical_labels=True, normalize=True)

# Shuffle the data
X, Y = shuffle(X, Y)

# Make sure the data is normalized
img_prep = ImagePreprocessing()
img_prep.add_featurewise_zero_center()
img_prep.add_featurewise_stdnorm()

# Create extra synthetic training data by flipping, rotating and blurring the
# images on our data set.
img_aug = ImageAugmentation()
img_aug.add_random_flip_leftright()
img_aug.add_random_rotation(max_angle=25.)
img_aug.add_random_blur(sigma_max=3.)

# Define our network architecture:

# Input is a 15x15 image with 3 color channels (red, green and blue)
network = input_data(shape=[None, 15, 15, 3],
                     data_preprocessing=img_prep,
                     data_augmentation=img_aug)

# Step 1: Convolution
network = conv_2d(network, 32, 3, activation='relu')

# Step 2: Max pooling
network = max_pool_2d(network, 2)

# Step 3: Convolution again
network = conv_2d(network, 64, 3, activation='relu')

# Step 4: Convolution yet again
network = conv_2d(network, 64, 3, activation='relu')

# Step 5: Max pooling again
network = max_pool_2d(network, 2)

# Step 6: Fully-connected 512 node neural network
network = fully_connected(network, 512, activation='relu')

# Step 7: Dropout - throw away some data randomly during training to prevent over-fitting
network = dropout(network, 0.4)

# Step 8: Fully-connected neural network with two outputs (0 = isn't skin, 1 = is skin) to make the final prediction
network = fully_connected(network, 2, activation='softmax')

# Tell tflearn how we want to train the network
network = regression(network, optimizer='adam',
                     loss='categorical_crossentropy',
                     learning_rate=0.001)

# Wrap the network in a model object
model = tflearn.DNN(network, tensorboard_verbose=0, checkpoint_path='logs/skin-classifier.tfl.ckpt')

# Train it! We'll do 100 training passes and monitor it as it goes.
model.fit(X, Y, n_epoch=100, shuffle=True, validation_set=0.33, 
    show_metric=True, batch_size=96, snapshot_epoch=True, run_id='skin-classifier')

# Save model when training is complete to a file
model.save("skin-classifier.tfl")

print("Network trained and saved as skin-classifier.tfl!")

Я разбил набор данных на две папки "train_data" и "test_data" с двумя подпапками "NOT_SKIN_15" и "SKIN_15" (вэтот порядок, я думаю, это важно) каждый.Обучение идет относительно хорошо:

Шаг обучения: 4200 |общий убыток: 0,14197 |время: 4.776с |Адам |эпоха: 100 |потери: 0,14197 - акк: 0,9507 |val_loss: 0.06002 - val_acc 0.9802 - iter: 3994/3994

Но после этого, когда я пытаюсь вычислить некоторые метрики для оценки модели, я получаю точность ~ 0,01 с последующей Матрица путаницы для обработанных тестовых данных:

36     1828
1117      1

Кажется, что в некоторых точках классы "меняются местами"Модель выдает 0, если она «думает», что это скин, а 1 - не скин.Однако на этапе обучения (я думаю) это было 0 для НЕ кожи, и 1 для кожи.Почему это происходит?

Сценарий оценки:

# Load the data set
X, Y = image_preloader("test_data", image_shape=(15, 15), mode='folder', categorical_labels=True, normalize=True)

# Shuffle the data
X, Y = shuffle(X, Y)

# Same network definition as before
img_prep = ImagePreprocessing()
img_prep.add_featurewise_zero_center()
img_prep.add_featurewise_stdnorm()
img_aug = ImageAugmentation()
img_aug.add_random_flip_leftright()
img_aug.add_random_rotation(max_angle=25.)
img_aug.add_random_blur(sigma_max=3.)

network = input_data(shape=[None, 15, 15, 3],
                     data_preprocessing=img_prep,
                     data_augmentation=img_aug)
network = conv_2d(network, 32, 3, activation='relu')
network = max_pool_2d(network, 2)
network = conv_2d(network, 64, 3, activation='relu')
network = conv_2d(network, 64, 3, activation='relu')
network = max_pool_2d(network, 2)
network = fully_connected(network, 512, activation='relu')
network = dropout(network, 0.4)
network = fully_connected(network, 2, activation='softmax')
network = regression(network, optimizer='adam',
                     loss='categorical_crossentropy',
                     learning_rate=0.001)

model = tflearn.DNN(network, tensorboard_verbose=0, checkpoint_path='skin-classifier.tfl.ckpt')
model.load("skin-classifier.tfl")

Y_predicted = model.predict_label(X)

cnf_matrix = confusion_matrix(Y.argmax(axis=1), Y_predicted.argmax(axis=1))
print("Confusion matrix: ")
print(cnf_matrix)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...