1
$\begingroup$

I want to implement a custom RNN/LSTM model similar to this. The model should take two separate vectors as input and process them. I was following keras tutorial to implement a custom keras layer and inputting two vectors a and b as a list [a,b] to the layer as shown below.

import keras
from keras.layers.recurrent import RNN
import keras.backend as K

class MinimalRNNCell(keras.layers.Layer):
    def __init__(self, units, **kwargs):
        self.units = units
        self.state_size = units
        super(MinimalRNNCell, self).__init__(**kwargs)
    def build(self, input_shape):
        print(type(input_shape))
        self.kernel = self.add_weight(shape=(input_shape[0][-1], self.units),
                                      initializer='uniform',
                                      name='kernel')
        self.recurrent_kernel = self.add_weight(
            shape=(self.units, self.units),
            initializer='uniform',
            name='recurrent_kernel')
        self.built = True
    def call(self, inputs, states):
        prev_output = states[0]
        h = K.dot(inputs[0], self.kernel)
        output = h + K.dot(prev_output, self.recurrent_kernel)
        return output, [output]

# Let's use this cell in a RNN layer:
cell = MinimalRNNCell(32)
a = keras.Input((None, 5))
b = keras.Input((None, 5))
layer = RNN(cell)
y = layer([a,b])

But I am getting the error TypeError: 'NoneType' object has no attribute '__getitem__' at

self.kernel = self.add_weight(shape=(input_shape[0][-1], self.units),
                                          initializer='uniform',
                                          name='kernel')

Also the type of the input_shape is showing as <type 'tuple'>, not a list. Whats wrong I am doing and how to overcome this error. Please help

$\endgroup$

1 Answer 1

0
$\begingroup$

I think, input_shape[0] is None. Based on my understanding, you will pass a matrix of size (Batch_size, Time steps, dim of each time step data) to an RNN cell. And while creating your architecture, input_shape[0] will give the batch size (if you mentioned what is the batch size in input layer, if not you will get None). Even if you mention batch size, it will be an integer and you can't index the integers so you are getting that error.

$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.