Вывод тензорного потока на большой ndarray: возможно ли ускорение работы с Cython или мультипроцессором? - PullRequest
0 голосов
/ 28 августа 2018

Я создал систему, которая выбирает около 20 000 мест, которые содержат классифицированные данные обучения, извлекает значения в DataFrame, а также обучает и сохраняет ванильную нейронную сеть (mlp). Затем я создаю большой np.ndarray, который требует логического вывода (data.shape = (60, 8000, 8000)), восстанавливаю модель и начинаю цикл for ~ 6-10 часов, который классифицирует каждое местоположение в пространстве 8000x8000 пикселей для получения классифицированного ndarray, new_array.shape = (1, 8000, 8000).

Мой вопрос прост: есть ли лучший способ, чем сделать цикл Python for для местоположений 64*10**6 пикселей, чтобы вывести это большое пространство пикселей?

Контекст: это проект, который собирает массив объектов из стека изображений Landsat и выбирает области известных классов земель в соответствии с векторными данными ГИС. Затем он выводит остальную часть изображения и записывает новый растр с rasterio . Тензорный многослойный персептрон равен здесь , конструкция обучающего массива равна здесь .

Код: я пытался удалить все фтерилы.

def classify_stack(data, model, out_location=None):

    final_shape = 1, data.shape[1], data.shape[2]

    # reshape, mask np.nan values
    data = data.reshape((data.shape[0], data.shape[1] * data.shape[2]))
    data[data == 0.] = np.nan
    m_stack = marray(data, mask=np.isnan(stack))

    n = m_stack.shape[0]

    new_array = np.zeros_like((data.shape[1], data.shape[2]), dtype=float16)

    g = tf.get_default_graph()

    with tf.Session() as sess:
        saver = tf.train.import_meta_graph('{}.meta'.format(model))
        saver.restore(sess, model)
        pixel = tf.placeholder("float", [None, n])

        wh = sess.graph.get_tensor_by_name('Wh:0')
        wo = sess.graph.get_tensor_by_name('Wo:0')
        bh = sess.graph.get_tensor_by_name('Bh:0')
        bo = sess.graph.get_tensor_by_name('Bo:0')
        classify = tf.add(tf.matmul(multilayer_perceptron(pixel, wh, bh), wo), bo)

        time = datetime.now()

        ct_nan = 0
        ct_out = 0

        for i in range(m_stack.shape[-1]):
            if not np.ma.is_masked(m_stack[:, i]):
                dat = m_stack[:, i]
                dat = array(dat).reshape((1, dat.shape[0]))
                loss = sess.run(classify, feed_dict={pixel: dat})
                new_array[0, i] = np.argmax(loss, 1)
                ct_out += 1
            else:
                new_array[0, i] = np.nan
                ct_nan += 1

            if i % 1000000 == 0:
                print('Count {} of {} pixels in {} seconds'.format(i, m_stack.shape[-1],
                                                                   (datetime.now() - time).seconds))

    new_array = new_array.reshape(final_shape)
    with rasopen(out_ras, 'w', **meta) as dst:
        dst.write(new_array)

Любые советы о структуре моей модели tf и возможных решениях на других языках (или cython?) И т. Д. Также приветствуются. Спасибо.

...