Pourquoi tensorflow utilise la chaîne-dernière commande au lieu de la ligne-majeur?
Dans la plupart des tensorflow tutoriels auteurs utilisent le canal-dernière dimension de la commande, par exemple
input_layer = tf.reshape(features, [-1, 28, 28, 1])
où le dernier chiffre représente le nombre de canaux (https://www.tensorflow.org/tutorials/layers). Utilisé pour Théano et Numpy (à la fois l'utilisation de C-commande, c'est à dire de la ligne-majeur), je trouve cela gênant. Par ailleurs, après avoir lu la la documentation sur dans-disposition de la mémoire de régimes de tensorflow, je pense que canal-dernière mise en page de causer plus de cache-misses, parce que les circonvolutions sont effectués sur des canaux individuels, tandis que dans le canal-dernière de la commande de ces canaux sont mélangés dans la mémoire linéaire, de manière efficace de réduire le cache par N (où N est le nombre de canaux), ce qui est particulièrement inefficace en 3D et 4D circonvolutions. Suis-je quelque chose de mal?
P. S.
J'ai trouvé un étroitement liées fil (Tensorflow 3 canal de commande de couleur entrées). L'auteur de la accepté de répondre états TF utilise ligne-major par défaut, mais étant donné que tous les tutoriels que j'ai trouvé jusqu'à présent montrent canal-derniere commande je trouve que l'allégation trompeuse.
Vous devez vous connecter pour publier un commentaire.
Voici l'explication:
https://www.tensorflow.org/performance/performance_guide#use_nchw_image_data_format
De plus, de creuser dans le code, nous pouvons voir ici que lorsque l'entrée est au format NHWC, tensorflow convertit pour vous de NCHW.
Vous pouvez spécifier le format des données que vous souhaitez utiliser pour chaque opération, mais tensorflow à défaut de ne pas utiliser NCHW mais NHWC, c'est pourquoi même les TF defelopers toujours utiliser NHWC pour éviter de spécifier dans chaque opération, le format
GPU
dansNCHW
format. Quand j'ai essayé de lancer ce surCPU
il jetaDefault MaxPoolingOp only supports NHWC. [[Node: max_pooling2d/MaxPool = MaxPool[T=DT_FLOAT, data_format="NCHW", ksize=[1, 1, 3, 3], padding="SAME", strides=[1, 1, 2, 2], _device="/job:localhost/replica:0/task:0/device:CPU:0"](initial_conv)]]
. Je peux utiliser ce modèle surGPU
mais pas surCPU
, savez-vous comment résoudre ce problème?Votre question est basée sur un malentendu.
Il n'y a pas de contradiction entre les lignes-major et NHWC. De la ligne des principaux moyens que les plus à droite de l'indice est celle qui cause le plus petit sauts dans la mémoire lorsqu'il a des changements et des modifications dans la plus à gauche de l'indice de provoquer le plus gros sauts. En ligne-majeur, la dernière dimension est contiguë, dans la colonne principale, le premier est. Voir https://en.wikipedia.org/wiki/Row-_and_column-major_order#Address_calculation_in_general pour la façon de calculer les décalages de mémoire pour un nombre quelconque de dimensions.
Donc, TF mémoire EST aménagé en ligne-major. Les différences dans ordre de l'index sont subtiles (certaines personnes préfèrent même CHWN - voir https://github.com/soumith/convnet-benchmarks/issues/66#issuecomment-155944875). NCHW est populaire parce que c'est ce cudnn fait de mieux. Mais, fondamentalement, chaque commune de la disposition de la mémoire dans le DL de ligne est majeur.