Come rimuovere il moltiplicatore dall'output di libtorch e visualizzare il risultato finale?
Quando provo a visualizzare / stampare alcuni tensori sullo schermo, mi trovo di fronte a qualcosa di simile a quanto segue dove invece di ottenere il risultato finale, sembra che libtorch mostri il tensore con un moltiplicatore (cioè 0.01*
e simili come puoi vedere sotto):
offsets.shape: [1, 4, 46, 85]
probs.shape: [46, 85]
offsets: (1,1,.,.) =
0.01 *
0.1006 1.2322
-2.9587 -2.2280
(1,2,.,.) =
0.01 *
1.3772 1.3971
-1.2813 -0.8563
(1,3,.,.) =
0.01 *
6.2367 9.2561
3.5719 5.4744
(1,4,.,.) =
0.2901 0.2963
0.2618 0.2771
[ CPUFloatType{1,4,2,2} ]
probs: 0.0001 *
1.4593 1.0351
6.6782 4.9104
[ CPUFloatType{2,2} ]
Come posso disabilitare questo comportamento e ottenere l'output finale? Ho provato a convertirlo in modo esplicito in float sperando che questo porti all'archiviazione / visualizzazione dell'output finalizzato, ma neanche questo funziona.
Risposte
Basandosi sul codice sorgente di libtorch per l'output dei tensori, dopo aver cercato la stringa "*" all'interno del repository, risulta che questa "bella stampa" viene eseguita nell'unità di traduzione aten / src / ATen / core / Formatting.cpp. La scala e l'asterisco sono anteposti qui:
static void printScale(std::ostream & stream, double scale) {
FormatGuard guard(stream);
stream << defaultfloat << scale << " *" << std::endl;
}
E successivamente tutte le coordinate del tensore sono divise per scale
:
if(scale != 1) {
printScale(stream, scale);
}
double* tensor_p = tensor.data_ptr<double>();
for(int64_t i = 0; i < tensor.size(0); i++) {
stream << std::setw(sz) << tensor_p[i]/scale << std::endl;
}
Basandosi su questa unità di traduzione, questo non è affatto configurabile.
Immagino che tu abbia due opzioni qui:
- Modifica le funzioni e modifica le funzioni già esistenti minimamente per soddisfare le tue esigenze.
- Rimuovi (o aggiungi
#ifdef
) l'<<
overload dell'operatore per Tensor in Formatting.cpp e fornisci la tua implementazione. Durante la creazione di libtorch, tuttavia, dovresti collegarlo alla tua destinazione contenente l'implementazione del metodo.
Entrambe le opzioni, tuttavia, richiedono la modifica del codice di terze parti, il che è piuttosto negativo, credo.