Я создал систему, которая выбирает около 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?) И т. Д. Также приветствуются. Спасибо.