Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

How to call TensorFlow model with linspace?

I’m trying to call a TensorFlow model on a linspace but I can’t seem to get even a very simple example (based on https://www.tensorflow.org/api_docs/python/tf/keras/Model) to work:

import tensorflow as tf

class FeedForward(tf.keras.Model):
    def __init__(self):
        super().__init__()
        self.dense1 = tf.keras.layers.Dense(4, activation=tf.nn.relu, name='lyr1')
        self.dense2 = tf.keras.layers.Dense(5, activation=tf.nn.softmax, name='lyr2')
    
    def call(self, inputs, training=False):
        x = self.dense1(inputs) # <--- error here
        return self.dense2(x)

model = FeedForward()
batchSize = 2048

preX = tf.linspace(0.0, 10.0, batchSize)
model(preX, training=True)

I get the following error (on the line indicated above):

ValueError: Exception encountered when calling layer "feed_forward_87" (type FeedForward).

Input 0 of layer "lyr1" is incompatible with the layer: expected min_ndim=2, found ndim=1. Full shape received: (2048,)

Call arguments received:
  • inputs=tf.Tensor(shape=(2048,), dtype=float32)
  • training=True

I have tried adding an input layer

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

import tensorflow as tf

class FeedForward(tf.keras.Model):
    def __init__(self):
        super().__init__()
        self.inLyr = tf.keras.layers.Input(shape=(2048,), name='inp')
        self.dense1 = tf.keras.layers.Dense(4, activation=tf.nn.relu, name='lyr1')
        self.dense2 = tf.keras.layers.Dense(5, activation=tf.nn.softmax, name='lyr2')
    
    def call(self, inputs, training=False):
        x = self.inLyr(inputs) # <---- error here
        x = self.dense1(x)
        return self.dense2(x)

model = FeedForward()
batchSize = 2048

preX = tf.linspace(0.0, 10.0, batchSize)
model(preX, training=True)

But then the error becomes

TypeError: Exception encountered when calling layer "feed_forward_88" (type FeedForward).

'KerasTensor' object is not callable

Call arguments received:
  • inputs=tf.Tensor(shape=(2048,), dtype=float32)
  • training=True

Any help is appreciated.

>Solution :

You do not need an explicit Input layer. You are just missing a dimension. Try using tf.expand_dims to get the required input shape (batch_size, features):

import tensorflow as tf

class FeedForward(tf.keras.Model):
    def __init__(self):
        super().__init__()
        self.dense1 = tf.keras.layers.Dense(4, activation=tf.nn.relu, name='lyr1')
        self.dense2 = tf.keras.layers.Dense(5, activation=tf.nn.softmax, name='lyr2')
    
    def call(self, inputs, training=False):
        x = self.dense1(inputs)
        return self.dense2(x)

model = FeedForward()
batchSize = 2048

preX = tf.expand_dims(tf.linspace(0.0, 10.0, batchSize), axis=-1)
model(preX, training=True)
<tf.Tensor: shape=(2048, 5), dtype=float32, numpy=
array([[2.0000000e-01, 2.0000000e-01, 2.0000000e-01, 2.0000000e-01,
        2.0000000e-01],
       [2.0061693e-01, 1.9939975e-01, 1.9954492e-01, 2.0115443e-01,
        1.9928394e-01],
       [2.0123295e-01, 1.9879854e-01, 1.9908811e-01, 2.0231272e-01,
        1.9856769e-01],
       ...,
       [4.1859145e-03, 1.6480753e-08, 7.3006660e-08, 9.9581391e-01,
        5.0233933e-09],
       [4.1747764e-03, 1.6337188e-08, 7.2423312e-08, 9.9582505e-01,
        4.9767293e-09],
       [4.1636685e-03, 1.6194873e-08, 7.1844603e-08, 9.9583614e-01,
        4.9305160e-09]], dtype=float32)>

Or with an Input layer:

class FeedForward(tf.keras.Model):
    def __init__(self):
        super().__init__()
        inputs = tf.keras.layers.Input((1,))
        dense1 = tf.keras.layers.Dense(4, activation=tf.nn.relu, name='lyr1')(inputs)
        dense2 = tf.keras.layers.Dense(5, activation=tf.nn.softmax, name='lyr2')(dense1)
        self.model = tf.keras.Model(inputs, dense2)
    def call(self, inputs, training=False):
        return self.model(inputs)
Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading