Использование tf.estimator для пользовательского вывода, следуя подходу Overfeat - PullRequest
0 голосов
/ 14 февраля 2020

Я хочу реализовать более быстрый подход к скользящему окну, называемый «OverFeat», описанный в следующей статье.

Ссылка: https://arxiv.org/abs/1312.6229

Я обучал MNIST Набор данных для прогнозирования цифр с помощью реализации L eNet 5. Я знаю, что мне нужно настроить сетевые слои, чтобы можно было получить C -мерный (c = classses) массив выходных данных для моего примененного windows. Но я не знаю, как это сделать, чтобы он выводил этот C -мерный массив, который имеет смысл. Мои текущие слои: (L eNet -5 стандартных слоев)

Ввод: (100,28,28,1)

Conv1: (100,28,28,32)

Pool1: (100,14,14,32)

Conv2: (100,14,14,64)

Pool2: (100,7,7,64) )

Pool2_flat: (100,3136)

Плотность: (100,1024)

Выпадение: (100,1024)

Logits: (100 , 10)

Теперь, если я правильно понял документ, я должен избавиться от слоя Pool2_flat и плотного слоя, но как я могу расположить слои, чтобы получить C -мерный выходной массив для * 1049? * во входном изображении?

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

Я использовал оценки для обучения, оценки и прогнозирования. В статье написано, что не меняют архитектуру сетей для обучения, а для вывода. Я сохранил свой график и контрольные точки, но когда я хочу сделать вывод, я не могу обратиться к измененной сети, потому что предсказание класса tf.estimator использует сохраненный график (из обучения).

Является ли это можно использовать измененную сеть для вывода, используя класс оценки высокого уровня?

def lenet_model_fn_big(features, labels, mode):
    features = tf.reshape(features["x"], [-1, 1920, 1080, 1], name="input")    
    # Convolution Layer 1
    conv1 = tf.layers.conv2d(inputs=features,
                             filters=32,
                             kernel_size=[5, 5],
                             padding="same",
                             activation=tf.nn.relu)
….
    # Logits Layer
    logits = tf.layers.dense(inputs=dropout,
                             units=10)
    predictions = {
        "classes" : tf.argmax(input=logits, axis=1),
        "probs" : tf.nn.softmax(logits=logits, name="softmax_tensor")
    }
    if mode == tf.estimator.ModeKeys.PREDICT:
        return tf.estimator.EstimatorSpec(mode=mode, predictions=predictions)

, чтобы получить предсказания, которые я вызываю:

mnist_classifier = tf.estimator.Estimator(model_fn=ln.lenet_model_fn_big,
                                              model_dir=config_dict["model_dir"])
                                              #params=tf.estimator.ModeKeys.PREDICT || config_dict)
# Prepare the input
predict_input_fn = tf.estimator.inputs.numpy_input_fn(x={"x":imageTensors},
                                                   num_epochs=1,
                                                   shuffle=False)

for single_prediction in mnist_classifier.predict(input_fn=predict_input_fn):
    predicted_class = single_prediction['classes']
    probability = single_prediction['probs']
    print(predicted_class, probability)

К сожалению, это не работает и дает мне следующая ошибка:

for single_prediction in mnist_classifier.predict(input_fn=predict_input_fnF:
TypeError: unhashable type: 'Dimension'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...