[PYTHON] Ce que vous pouvez et ne pouvez pas faire avec Tensorflow 2.x

Tensorflow 2.x je ne sais rien

Suite à la mise en œuvre de la méthode avec TF 2.x, il est une personne en feu. Cela fait environ un an que TF 2.x est sorti, mais je vais résumer ce que TF 2.x a fait, ce qu'il n'a pas fait et les méthodes qui ont récemment vu le jour.

Pouvez-vous faire cela? N'est-ce pas faux? S'il y a quelque chose comme ça, veuillez le signaler et le corriger. À l'avenir, ceux qui souffrent de ce ~~ putain de ~~ framework seront sauvés.

Ce que vous pouvez faire avec Tensorflow 2.x

PyTorch, écriture à la Keras

Avec l'ajout d'Eager Execution, tf.session est devenu obsolète et l'interpréteur peut désormais exécuter des fonctions tf. Cela a rendu le débogage plus facile et plus facile à exécuter.

De plus, en raison du flux d'intégration avec keras, une implémentation utilisant tf.keras.layer ( nn.Module? Dans PyTorch) a été promue. D'autre part, les implémentations fonctionnelles existantes sont maintenant agrégées sous «tf.nn», par exemple BatchNormalization est «tf.nn.batch_normalization».

Utilisation du TPU

Il semble que l'utilisation du TPU soit de plus en plus pratique. Articles par ici est très facile à lire, alors veuillez le lire.

Ce que vous ne pouvez pas faire avec Tensorflow 2.x

~~BatchNormalization~~ Vous pensez peut-être que la normalisation par lots n'est pas possible, mais de manière inattendue, cette couche comporte de nombreux trous et il est difficile de trouver une implémentation correcte (je me demande s'il n'y a pas encore d'implémentation correcte ...)

Le problème est que ** ne peut pas gérer les opérations avec plusieurs GPU / TPU **, et c'est PyTorch. #syncbatchnorm) et MxNet ont été implémentés, mais TF 2.x n'a pas encore été implémenté. Le moment où je me suis appuyé sur horovod pour MultiGPU / TPU (série TF 1.x) a été réalisé grâce au soutien de cette personne, mais à la suite d'essayer de l'implémenter à l'intérieur de TF reporté //github.com/tensorflow/community/blob/master/rfcs/20181016-replicator.md#global-batch-normalization).

Ce problème semble ennuyeux dans toute la famille TF 2.x, car de nombreux chercheurs s'échappent vers PyTorch. ) C'est un problème difficile.

Le dernier numéro actuellement ouvert est probablement ici alors rejoignez-nous (je me fouille aussi).

--2020 / 2/3 La couche elle-même a été ajoutée. Cependant, il est douteux qu'il ait été testé, alors ne vous attendez pas à trop.

Calcul multi GPU / TPU (WIP)

Pour le moment, TF 2.x peut calculer avec plusieurs GPU / TPU! Cela dit, la réalité est qu'il est plein de support expérimental, comme indiqué dans Officiel. Par conséquent, il y a une forte possibilité que la fonction de roulement change, et il est difficile de s'attendre à une compatibilité ascendante.

Initialisation des variables avec des données batch

L'initialisation avec les données de lots initiales, qui est rarement utilisée dans l'apprentissage en profondeur, ne peut pas être effectuée tant que cela est également observé. La méthode consiste à réécrire le poids de la couche directement de l'extérieur en fonction du lot initial, ce qui nécessite de concevoir une fonction externe à initialiser et un mécanisme pour appeler cette fonction externe pendant la formation. Cela rend difficile l'utilisation des habituels «tf.keras.Model» et «tf.keras.Sequential» (au moins «fit ()» ne peut pas être utilisé et doit être entraîné dans une boucle d'entraînement personnalisée). (Exemple)

class IdentityWithInit:
   def build(self, input_shape: tf.TensorShape):
        self.initialized = self.add_weight(
            name="initialized",
            dytpe=tf.bool,
            trainable=False 
        )
        self.initialized.assign(False)
        self.built = True
   def initialize_parameter(self, x: tf.Tensor):
        tf.print("initialized {}".format(self.name)) 
        pass

   def __init__(self):
       super()__init__()

   def call(self, x:tf.Tensor):
       if not self.initialized:
           self.initialize_parameter(x)
           self.initialized.assign(True)
       return x

Calcul du gradient (2.0.0)

En 2.0.0, le calcul du gradient semble accidentel dans un cas particulier. (Je pensais que c'était sain d'esprit, mais cela semble être approprié)

Mais 2.1.0 A été réparé. (Je l'ai également testé à portée de main, mais il a été corrigé.)

Utilisation de la barre oblique

Il est rarement utilisé lors de l'écriture d'une très longue phrase en Python, mais Tensorflow ne semble pas utiliser l'arbre d'analyse de syntaxe de Python (?), Donc cela ne peut pas être utilisé. https://github.com/tensorflow/tensorflow/issues/35765

Mauvais exemple


variable * decay * \ 
 lr

Bon exemple


(variable * decay * 
lr)

Utilisation de Python 3.8

La prise en charge de Python 3.8 semble commencer à la mi-2020/02. (Il semble que vous puissiez l'essayer en faisant une compilation source)

https://github.com/tensorflow/tensorflow/issues/33374

Tensorflow 2.x Manners

Créer une classe de tâches

J'ai remarqué cela récemment, donc je ne sais pas tout, mais apparemment les [quelques implémentations] officielles (https://github.com/tensorflow/models/blob/master/official/transformer/v2/ En ce qui concerne transformer_main.py), il semble recommandé de créer une classe pour l'apprentissage et l'inférence séparément de la classe modèle.

Fondamentalement, les fonctions à implémenter sont la formation, le test train, test (eval) ʻet xxx_step, et pour xxx_step, c'est une fonction qui traite un lot et un décorateur tf.function`. Le motif entouré par est souvent vu.

class MyTask:
  def __init__(self, args):
     ...
     self.loss = tf.metrics.Mean(name='loss', dtype=tf.float32)

  def train(self):
    @tf.function
    def train_step(x: tf.Tensor, y: tf.Tensor):
      ...
      _y = self.model(x)
      loss = loss_fn(_y, y)
      self.loss(loss)

    for epoch in range(self.epochs):
      for x, y in tqdm(self.train_dataset):
        train_step(x, y)
      for x, y in self.val_dataset:
        val_step(x, y)
      print('EPOCH {} train: loss {} / val: loss {}'.format(epoch + 1, 
         self.loss.result(), self.val_loss.result()))
      self.loss.reset_states()
      self.val_loss.reset_states()    
  
  def test(self):
    @tf.function
    def test_step(x: tf.Tensor, y: tf.Tensor):
      ...

couche personnalisée ** kwargs

J'écris une classe Tensorflow Quel est cet argument? J'ai pensé, mais c'est un argument plus important que ce à quoi je m'attendais, et il est très utile lors du changement de raisonnement / apprentissage de la couche BatchNormalization et de la couche Dropout, par exemple.

Par exemple

class CustomLayer(Layer):
  def __init__(self):
    self.conv = Conv2D(...)
    self.bn = BatchNormalization(...)
    super().__init__()

  def build(self, input_shape):
    super().build(input_shape)

  def call(self, x: tf.Tensor, **kwargs):
    y = self.conv(x, **kwargs)
    y = self.bn(y, **kwargs)

cl = CustomLayer()

BatchNormalization peut être exécuté en mode inférence en définissant cl (x, training = False).

Recommended Posts

Ce que vous pouvez et ne pouvez pas faire avec Tensorflow 2.x
Python | Ce que vous pouvez faire avec Python
Ce que vous pouvez faire avec l'API vol.1
Ce que vous pouvez faire avec des compétences en programmation
Ce que vous pouvez faire avec les statistiques de la bibliothèque Python standard
Considérez ce que vous pouvez faire avec Python dans l'article Qiita
Vous devenez ingénieur en 100 jours - Jour 35 - Python - Ce que vous pouvez faire avec Python
Liens pour faire ce que vous voulez avec Sublime Text
Qu'est-ce que pip et comment l'utilisez vous?
Ce que vous ne pouvez pas faire avec hstack ou vstack avec dstack
Jusqu'à ce que vous puissiez faire une reconnaissance d'image simple avec Jupyter
Que faire si vous exécutez python sur IntelliJ et quittez avec une erreur
[AWS] Que faire lorsque vous souhaitez piper avec Lambda
Que faire si vous ne pouvez pas trier les fichiers avec des indices
[Python] Que faites-vous avec la visualisation de 4 variables ou plus?
Que faire avec l'installation de Magics
Que faire si vous ne pouvez pas installer pyaudio avec pip #Python
Que faire si vous obtenez une erreur de décodage Unicode avec l'installation de pip
Que faire avec la sortie de PYTHON?
Que faire si vous ne pouvez pas construire un projet avec Maven
Que faire si vous recevez le message "" ~ .pkg "est corrompu et ne peut pas être ouvert" lors de l'installation de wxPython sur Mac OS X
Que faire si l'option -f de grep ne fonctionne pas
Vous pouvez également vérifier la communication de la base de données et du cache avec curl
Que faire si vous ne parvenez pas à envoyer un e-mail à Yahoo avec Python.
Que faire si vous vous fâchez avec TensorFlow v2 sans l'attribut "app"
Que faire lorsque TypeError se produit au minimum et au maximum de numpy
Jusqu'à ce que vous puissiez emprunter VPS avec Conoha et authentifier la clé publique avec SSH
Depuis pandas1.0.0, vous pouvez spécifier l'URL S3 / GCS avec read_pickle () et to_pickle ()!
Vous pouvez le faire avec Python! Analyse structurale de cristaux colloïdaux bidimensionnels
Que faire si vous obtenez Impossible de récupérer l'URL 443 avec pip
Apprenez les données distribuées avec TensorFlow Y = 2X
Que dites-vous en gros "sudo su"?
Comparez le TensorFlow brut avec tf.contrib.learn et Keras
Analyse des données, que faites-vous après tout?
Résumons ce que vous voulez faire.
Peut être fait en 5 minutes!? Créez une API de détection de visage avec Fast API et OpenCV et publiez-la sur Heroku
swapon failed: Que faire si vous vous fâchez contre l'opération non autorisée
Si vous les gars dans la cuisine de portée pouvez le faire avec une marge ~ ♪
[Pour les débutants] Vous pouvez le faire à partir de zéro! Création d'API avec AWS SAM et sortie de documents Open API en Python
Jusqu'à ce que vous définissiez ce que vous avez fait avec Django avec Jenkins
Pouvez-vous défier Kaggle avec seulement votre iPad?
Vous pouvez gérer les caractères qui se chevauchent avec plusieurs plt.text.
Que faire si mod_fcgid ne peut pas résoudre UnicodeEncodeError
Vous pouvez facilement créer une interface graphique même avec Python
Que faire si pip ne peut pas être installé
Que dois-je faire avec DICOM de MPEG2?
Vous pouvez maintenant afficher des diapositives avec nbviewer! [Jupyter]
Gestionnaire de fenêtres personnalisé (Avez-vous un gestionnaire de fenêtres X? 2)
Si vous vous perdez avec les redirections HTTP 301 et 302
Qu'utilisez-vous lorsque vous testez avec Python?
Que faire si vous obtenez une erreur OpenSSL lors de l'installation de Python 2 avec pyenv
Que faire si pvcreate produit beaucoup d'AVERTISSEMENT et ne peut pas être créé
Jusqu'à ce que vous puissiez installer Blender et l'exécuter avec python pour le moment
Comment installer et utiliser pyenv, que faire si vous ne pouvez pas changer de version de Python
Que faire si vous obtenez une erreur d'importation lors de l'importation de matplotlib avec Jupyter