Red de conocimiento informático - Problemas con los teléfonos móviles - La diferencia entre tensor.view(), tensor.reshape() y tensor.resize_()

La diferencia entre tensor.view(), tensor.reshape() y tensor.resize_()

Ya sabemos que los tensores de pytorch constan de dos partes: "cabeza" y "almacenamiento", donde los datos reales del tensor se almacenan en una memoria continua en forma de una matriz unidimensional (almacenamiento ).

Ver significa literalmente "vista". Es una forma de mostrarnos los tensores originales en una disposición determinada. view() no cambiará el espacio de almacenamiento original ni creará otros nuevos. espacio, sólo se creará una nueva área de encabezado. view() no cambia el espacio de almacenamiento original, ni crea un nuevo espacio de almacenamiento, simplemente crea un nuevo título.

Esencialmente, view() devuelve algún tipo de vista organizada de almacenamiento unidimensional que solo puede representarse mediante cortes equidistantes consecutivos almacenados y pilas verticales consecutivas almacenadas (en lugar de cortes con saltos), como se muestra en el ejemplo. abajo.

Nota: view() no se puede utilizar si el tensor es discontinuo ( /p/51678ea7a959 ).

Sabemos que si el tensor no es continuo, no se puede utilizar el método view().

View() solo se puede usar después de convertir un tensor discontinuo en un tensor continuo (usando contiguous(), /p/51678ea7a959).

reshape() hace exactamente esto, completa la serialización antes que view().

La diferencia entre reshape() y view():

(1) Cuando el tensor cumple con los requisitos de continuidad, reshape() = view(), tensor original*** Usar área de almacenamiento;

(2) Cuando el tensor no cumple con los requisitos de continuidad, reshape() = ** contiguous() view(), generará un tensor con una nueva área de almacenamiento, los tensores originales. No utilice necesariamente áreas de almacenamiento.

Como se mencionó anteriormente, tanto view() como reshape() deben usar todos los datos originales, por ejemplo, si solo tienes 12 datos originales, entonces no importa cómo remodeles, debes usar 12 números, no, ni más ni menos. Por lo tanto, no se puede forzar la remodelación de un tensor con solo 12 números en un tensor de 2 × 5.

Pero resize_() puede hacer esto, no importa cuántos números haya en el almacenamiento original, puedo convertirlo en las dimensiones que desees. ¿Qué pasa si los números no son suficientes? ¿Qué debo hacer si hay demasiados números? ¡Sólo saca las piezas que necesito!

1. Intercepción:

El tensor a original cambiará, pero el espacio de almacenamiento no cambiará (la dirección y el valor permanecen sin cambios), mientras que a y b *** * son diferentes del espacio de almacenamiento (Aquí está 2638930351680

).

2. Al agregar: el tensor original a cambiará y el almacenamiento también cambiará (la dirección y el valor cambiarán), pero a y b seguirán siendo consistentes con el almacenamiento (aquí 2638924338752

).