72 lines
1.7 KiB
Plaintext
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]
|