В c ++, как сделать ломтик тензора из Tensor :: тензор? - PullRequest
0 голосов
/ 20 апреля 2019

У меня есть Tensor :: тензор, который я буду нарезать несколько раз и изменить значение на лету. И нарезанное значение будет подано в сеть. Поэтому мне нужен эффективный и элегантный способ выполнения операций нарезки и подачи.

Я использую версию тензорного потока для С ++, и наиболее интуитивно понятный способ в Python так же прост, как использовать numpy's arr [:, h: h + 3, w: w + 3,:] и feeddict.

Но в с ++, вот так

for h{
   for w{
         for i in range 3{
             for j in range 3{
                 new_tensor(i,j) = m_tensor(h+i,w+j)
             }
         }
         out = sess->run(out_node, in:new_tensor)
         m_tensor(h,w) = out.xxx
   }
}

метод не так элегантен, как я ожидал.

  1. получение ломтика

Сначала я пытался использовать операцию среза Eigen :: tenor для прямой передачи его в Tensor :: tenser, но странные ошибки мешают его компиляции

https://bitbucket.org/eigen/eigen/src/default/unsupported/Eigen/CXX11/src/Tensor/README.md?fileviewer=file-view-default#markdown-header-operation-chipconst-index-offset-const-index-dim

Тогда я думаю, что хорошо, я просто нарежу его, а затем скопирую в тензор.

  1. преобразовать его в тензор

Наиболее показанные результаты:

std::copy_n(vec.begin(), vec.size(), input.flat<float>().data())

или

std::memcpy(input.flat<float>().data(), vec.data(), input.NumElements() * sizeof(float))

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

         for i in range 3{
             for j in range 3{
                 new_tensor(i,j) = m_tensor(h+i,w+j)
             }
         }
...