72 lines
1.7 KiB
Plaintext

This rule raises an issue when a `tensorflow.Variable` created inside of a `tensorflow.function` is not a singleton.
== Why is this an issue?
``tensorflow.function``s only supports singleton ``tensorflow.Variable``s. This means the variable will be created on the first call
of the `tensorflow.function` and will be reused across the subsequent calls. Creating a `tensorflow.Variable` that is not a singleton
will raise a `ValueError`.
[source,python]
----
import tensorflow as tf
@tf.function
def f(x):
v = tf.Variable(1.0)
return v
----
In the example above each time the function `f` will be called a new `tensorflow.Variable` will be created.
== How to fix it
To fix this issue use the singleton pattern to avoid the creation of a `tensorflow.Variable` multiple times.
=== Code examples
==== Noncompliant code example
[source,python,diff-id=1,diff-type=noncompliant]
----
import tensorflow as tf
class Count(tf.Module):
def __init__(self):
self.count = None
@tf.function
def __call__(self):
self.count = tf.Variable(0) # Noncompliant: the variable will be re-created for each call
return self.count.assign_add(1)
c = Count()
c() # ValueError is raised
c()
----
==== Compliant solution
[source,python,diff-id=1,diff-type=compliant]
----
import tensorflow as tf
class Count(tf.Module):
def __init__(self):
self.count = None
@tf.function
def __call__(self):
if self.count is None:
self.count = tf.Variable(0) # Compliant: the variable is created only on during the first call
return self.count.assign_add(1)
c = Count()
c()
c()
----
== Resources
=== Documentation
* TensorFlow Documentation - https://www.tensorflow.org/guide/function#creating_tfvariables[Creating tf.Variables]