Jacob Feldman
Jacob Feldman

Reputation: 21

Tensor Shape Not Recognized in Tensorflow 2.0

I cant get my RNN classifier to work with my input data. I am using TF 2.0 pre-release with a sliding window.

I am trying to build an RNN which I am feeding 5 timesteps with 6 features each and having it produce the 6th timestep as the target. When I run my code it is giving me an error saying that the input is (None,6) where as when I print out my training data it clearly says the shape is (5,6). I am very confused as to how to fix this.

Error:

File "C:\Users\employee\AppData\Local\Programs\Python\Python36\lib\site-packages\tensorflow_core\python\keras\engine\training.py", line 734, in fit
    use_multiprocessing=use_multiprocessing)
  File "C:\Users\employee\AppData\Local\Programs\Python\Python36\lib\site-packages\tensorflow_core\python\keras\engine\training_v2.py", line 224, in fit
    distribution_strategy=strategy)
  File "C:\Users\employee\AppData\Local\Programs\Python\Python36\lib\site-packages\tensorflow_core\python\keras\engine\training_v2.py", line 547, in _process_training_inputs
    use_multiprocessing=use_multiprocessing)
  File "C:\Users\employee\AppData\Local\Programs\Python\Python36\lib\site-packages\tensorflow_core\python\keras\engine\training_v2.py", line 593, in _process_inputs
    steps=steps)
  File "C:\Users\employee\AppData\Local\Programs\Python\Python36\lib\site-packages\tensorflow_core\python\keras\engine\training.py", line 2384, in _standardize_user_data
    all_inputs, y_input, dict_inputs = self._build_model_with_inputs(x, y)
  File "C:\Users\employee\AppData\Local\Programs\Python\Python36\lib\site-packages\tensorflow_core\python\keras\engine\training.py", line 2587, in _build_model_with_inputs
    self._set_inputs(cast_inputs)
  File "C:\Users\employee\AppData\Local\Programs\Python\Python36\lib\site-packages\tensorflow_core\python\keras\engine\training.py", line 2674, in _set_inputs
    outputs = self(inputs, **kwargs)
  File "C:\Users\employee\AppData\Local\Programs\Python\Python36\lib\site-packages\tensorflow_core\python\keras\engine\base_layer.py", line 772, in __call__
    self.name)
  File "C:\Users\employee\AppData\Local\Programs\Python\Python36\lib\site-packages\tensorflow_core\python\keras\engine\input_spec.py", line 177, in assert_input_compatibility
    str(x.shape.as_list()))
ValueError: Input 0 of layer sequential is incompatible with the layer: expected ndim=3, found ndim=2. Full shape received: [None, 6]

Print readout:

********************tf.Tensor(
[[0.07812838 0.08639083 0.07809999 0.08601701 0.6974719  0.6974719 ]
 [0.06794664 0.06995372 0.06220453 0.06934043 0.70064694 0.70064694]
 [0.08323035 0.08651368 0.07691107 0.08147305 0.69750804 0.69750804]
 [0.09781507 0.10009027 0.08847085 0.08919457 0.6944895  0.6944895 ]
 [0.12235662 0.12269666 0.11316498 0.11738694 0.6868     0.6868    ]], shape=(5, 6), dtype=float32)********************tf.Tensor([[0.08238748 0.09074993 0.07986343 0.09017278 0.6965872  0.6965872 ]], shape=(1, 6), dtype=float32)********************
/data comes in as an array of shape [737,6]

train=tf.data.Dataset.from_tensor_slices(features).window(6,1,1,drop_remainder=True).flat_map(lambda x: x.batch(6)).map(lambda window: (window[:-1],window[-1:]))

valid=train.take(200).shuffle(1000).repeat()
train=train.shuffle(3000).repeat()

for x,y in valid:
    print('*'*20+str(x)+"*"*20+str(y)+"*"*20)

print(train)


model = tf.keras.Sequential()

model.add(layers.SimpleRNN(128,batch_size=10))
model.add(layers.Dense(124,kernel_initializer='he_uniform',activation='softmax'))

model.compile(optimizer='adagrad', batch_size=10,step_size=.01, loss=tf.keras.losses.MeanAbsoluteError(), metrics=['accuracy'])



history = model.fit(train,epochs=100, validation_data=valid,steps_per_epoch=3000,validation_steps=1000)

Upvotes: 2

Views: 163

Answers (2)

karandeep36
karandeep36

Reputation: 336

You need to reshape your data or train variable into 3 dimensions i.e. "[batch, timesteps, features]".

The model is expecting 3 dimensionsal input and your data is 2 dimensional.

You can reshape your data like this :

data = tf.reshape(data, [-1,5,6])

And it should solve your issue.

Upvotes: 0

Sandeep
Sandeep

Reputation: 21

The model expects an input with rank 3, but is passed an input with rank 2.

The first layer is a SimpleRNN, which expects data in the form (batch_size, timesteps, features), i.e. rank 3. The shape of the data passed by the user is (5, 6), i.e. rank 2.

Passing rank-3 data (including the batch dimension) will fix the issue.

Upvotes: 2

Related Questions