Машинное обучение изображений tflearn/tensorflow в оттенках серого

В настоящее время я пытаюсь разработать CNN с tflearn для обнаружения объектов. Мои данные поступают из файла рассола, поэтому у меня нет файлов .png или подобных. Мои изображения хранятся как numpy.array с формой:

 (34799, 32, 32, 3)

34799 — это количество изображений, поэтому в основном форма равна 32,32,3.

мой CNN определяется следующим образом:

    import tflearn
from tflearn.layers.core import input_data, fully_connected, flatten, dropout
from tflearn.layers.conv import conv_2d, max_pool_2d
from tflearn.layers.estimator import regression
from tflearn.metrics import Accuracy

# Building convolutional network
def neural_network(X, y, dropoutRate=0.8):
    network = input_data(shape=[None, 32, 32, 3], name='input')

    network = conv_2d(network, nb_filter=6, filter_size=5, strides=1, activation='relu', padding="VALID")

    network = conv_2d(network, 6, 4, activation='relu')
    network = max_pool_2d(network, 2)

    network = conv_2d(network, 16, 5, strides=1, activation="relu", padding="VALID")
    network = max_pool_2d(network, 2, padding="VALID")

    network = dropout(incoming=network, keep_prob=dropoutRate)
    network = fully_connected(network, 84, activation="relu")
    network = flatten(network)
    network = fully_connected(network, 43, activation='softmax')

    acc = Accuracy()
    network = regression(network, optimizer='adam', learning_rate=0.001,
                         loss='categorical_crossentropy', name='target')
    # Training
    model = tflearn.DNN(network, tensorboard_verbose=0)
    model.fit(X_test, y_test, n_epoch=7, batch_size=20, show_metric=True, snapshot_epoch=True, run_id="trafficSign", snapshot_step=500, validation_set=(X_valid, y_valid))
    return model

моя проблема в том, что когда я превращаю изображения в серые с помощью встроенной функции тензорного потока:

tf.image.rgb_to_grayscale(X_train)

так что это тензор, исходящий от функции

<tf.Tensor 'rgb_to_grayscale_6:0' shape=(34799, 32, 32, 1) dtype=float64>

но при изменении первой части моего CNN. input_data() к форме [32,32,1] я получаю сообщение об ошибке, что форма неверна, и она не может заполнить форму, потому что она имеет форму [32,32].

Итак, мой вопрос: есть ли простой способ добавить 1 к моей форме?

Спасибо за вашу помощь и, пожалуйста, сообщите мне, если вам нужна дополнительная информация


person Patrick.H    schedule 07.08.2017    source источник


Ответы (1)


1-е решение. Вы можете внести изменения внутри сети.

network = input_data(shape=[None, 32, 32, 3], name='input')
network = tf.image.rgb_to_grayscale(network)
network = conv_2d(network, nb_filter=6, filter_size=5, strides=1, activation='relu', padding="VALID")
...

2-е решение. Кроме того, вы можете уменьшить дополнительную сложность преобразования данных в каждую эпоху.

используйте PIL/opencv для преобразования изображений RGB в серый

  now you have X_TRAIN = (34799, 32, 32)
  # conver the input into 4D
  X_TRAIN = np.expand_dims(X_TRAIN, 3)

используйте незначительную модифицированную версию первого кода

network = input_data(shape=[None, 32, 32, 1], name='input')
network = conv_2d(network, nb_filter=6, filter_size=5, strides=1, activation='relu', padding="VALID")
...
person Ishant Mrinal    schedule 07.08.2017
comment
Я попробовал ваше предложение и сначала получил ошибку dtype. После приведения данных обратно в float32. произошла следующая ошибка. файл не должен быть больше 2 Гб, что невозможно. Обучающая выборка имеет размер 104 мб. Я бы загрузил картинку, но не знаю как - person Patrick.H; 07.08.2017
comment
возможно, вы используете неправильный способ подачи данных. просмотрите tflearn документы tflearn.org/helpers/trainer - person Ishant Mrinal; 07.08.2017
comment
Я попробую ваш второй подход, как только вернусь с работы. Большое спасибо! - person Patrick.H; 08.08.2017