Splitting Input inside Keras Model

Viewed 42

hi i have build a model using keras that excepts a (1,1002,4) shape input. I want to split this tensor in (1,1000,4) and (1,2,4) and then get the first item of both rows from second split as (1,2) then concat it later to flatten layer of shape (None,4096) and pass it down the model as (None,4096) but it gives me a error.

code:

import tensorflow as tf

from tensorflow.keras.layers import Conv1D, Input, MaxPool1D, concatenate, Lambda, Dense, Flatten

def ActorNetwork(input_shape, n_actions):
    input_layer = Input(shape=input_shape[1:], name="input_layer")

    Split_1 = Lambda(lambda x: x[:-2])(input_layer)
    Split_2 = Lambda(lambda x: tf.transpose(x[0][-2:])[0])(input_layer)

    Rescale = Lambda(lambda x: tf.divide(tf.subtract(x, tf.reduce_max(x)), tf.subtract(tf.reduce_max(x), tf.reduce_min(x))))(Split_1)

    Conv1 = Conv1D(64, 1, activation='relu', padding='same', name="Conv1")(Rescale)

    Concat_1 = tf.keras.layers.concatenate([Conv1, Rescale], axis=-1,name='Concat_1')

    Batchnorm_1 = tf.keras.layers.BatchNormalization(name='Batchnorm_1')(Concat_1)

    Conv2 = Conv1D(64, 3, activation='relu', padding='same', name="Conv2")(Batchnorm_1)
    Conv3 = Conv1D(64, 3, activation='relu', padding='same', name="Conv3")(Conv2)

    Conv_pool_1 = Conv1D(64, 3, strides=2, activation='relu', padding='same', name="Conv_pool_1")(Conv3)

    Batchnorm_2 = tf.keras.layers.BatchNormalization(name='Batchnorm_2')(Conv_pool_1)

    Conv4 = Conv1D(128, 3, activation='relu', padding='same', name="Conv4")(Batchnorm_2)
    Conv5 = Conv1D(128, 3, activation='relu', padding='same', name="Conv5")(Conv4)

    Conv_pool_2 = Conv1D(64, 3, strides=2, activation='relu', padding='same', name="Conv_pool_2")(Conv5)

    Batchnorm_3 = tf.keras.layers.BatchNormalization(name='Batchnorm_3')(Conv_pool_2)

    Conv6 = Conv1D(256, 3, activation='relu', padding='same', name="Conv6")(Batchnorm_3)
    Conv7 = Conv1D(256, 3, activation='relu', padding='same', name="Conv7")(Conv6)

    Conv_pool_3 = Conv1D(64, 3, strides=2, activation='relu', padding='same', name="Conv_pool_3")(Conv7)

    Batchnorm_4 = tf.keras.layers.BatchNormalization(name='Batchnorm_4')(Conv_pool_3)

    Conv8 = Conv1D(512, 3, activation='relu', padding='same', name="Conv8")(Batchnorm_4)
    Conv9 = Conv1D(512, 3, activation='relu', padding='same', name="Conv9")(Conv8)

    Batchnorm_5 = tf.keras.layers.BatchNormalization(name='Batchnorm_5')(Conv9)

    Conv_pool_4 = Conv1D(512, 3, strides=2, activation='relu', padding='same', name="Conv_pool_4")(Batchnorm_5)
    Conv_pool_5 = Conv1D(512, 3, strides=2, activation='relu', padding='same', name="Conv_pool_5")(Conv_pool_4)
    Conv_pool_6 = Conv1D(512, 3, strides=2, activation='relu', padding='same', name="Conv_pool_6")(Conv_pool_5)
    Conv_pool_7 = Conv1D(512, 3, strides=2, activation='relu', padding='same', name="Conv_pool_7")(Conv_pool_6)

    flatten = Flatten()(Conv_pool_7)
    

    Concat_2 = tf.keras.layers.concatenate([flatten, Split_2], axis=-1,name='Concat_2')


    fc1 = Dense(4098, activation='relu', name="fc1")(Concat_2)
    fc2 = Dense(4096, activation='relu', name="fc2")(fc1)
    fc3 = Dense(n_actions, activation='softmax', name="fc3")(fc2)

    return tf.keras.models.Model(input_layer, fc3, name="actor_model")


model=ActorNetwork((1,1002,4),3)
model.compile()
model.summary()

error:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-4-618019cd1fa2> in <module>
     59 
     60 
---> 61 model=ActorNetwork((1,1002,4),3)
     62 model.compile()
     63 model.summary()

3 frames
/usr/local/lib/python3.7/dist-packages/keras/layers/merge.py in build(self, input_shape)
    517       ranks = set(len(shape) for shape in shape_set)
    518       if len(ranks) != 1:
--> 519         raise ValueError(err_msg)
    520       # Get the only rank for the set.
    521       (rank,) = ranks

ValueError: A `Concatenate` layer requires inputs with matching shapes except for the concatenation axis. Received: input_shape=[(None, 4096), (2,)]

You can run the above code.I am facing the problem in Concat_2 layer. I think it has something to do with batch dimension but dont know how to handel it. I know i can handel it with multiple input model but i am using it for reinforcement learning and having 2D states increases more complexicity in code. Dose anyone know how to solve this problem. Thanks.

Model Summary:

Model: "actor_model"
__________________________________________________________________________________________________
 Layer (type)                   Output Shape         Param #     Connected to                     
==================================================================================================
 input_layer (InputLayer)       [(None, 1002, 4)]    0           []                               
                                                                                                  
 lambda (Lambda)                (None, 1002, 4)      0           ['input_layer[0][0]']            
                                                                                                  
 lambda_2 (Lambda)              (None, 1002, 4)      0           ['lambda[0][0]']                 
                                                                                                  
 Conv1 (Conv1D)                 (None, 1002, 64)     320         ['lambda_2[0][0]']               
                                                                                                  
 Concat_1 (Concatenate)         (None, 1002, 68)     0           ['Conv1[0][0]',                  
                                                                  'lambda_2[0][0]']               
                                                                                                  
 Batchnorm_1 (BatchNormalizatio  (None, 1002, 68)    272         ['Concat_1[0][0]']               
 n)                                                                                               
                                                                                                  
 Conv2 (Conv1D)                 (None, 1002, 64)     13120       ['Batchnorm_1[0][0]']            
                                                                                                  
 Conv3 (Conv1D)                 (None, 1002, 64)     12352       ['Conv2[0][0]']                  
                                                                                                  
 Conv_pool_1 (Conv1D)           (None, 501, 64)      12352       ['Conv3[0][0]']                  
                                                                                                  
 Batchnorm_2 (BatchNormalizatio  (None, 501, 64)     256         ['Conv_pool_1[0][0]']            
 n)                                                                                               
                                                                                                  
 Conv4 (Conv1D)                 (None, 501, 128)     24704       ['Batchnorm_2[0][0]']            
                                                                                                  
 Conv5 (Conv1D)                 (None, 501, 128)     49280       ['Conv4[0][0]']                  
                                                                                                  
 Conv_pool_2 (Conv1D)           (None, 251, 64)      24640       ['Conv5[0][0]']                  
                                                                                                  
 Batchnorm_3 (BatchNormalizatio  (None, 251, 64)     256         ['Conv_pool_2[0][0]']            
 n)                                                                                               
                                                                                                  
 Conv6 (Conv1D)                 (None, 251, 256)     49408       ['Batchnorm_3[0][0]']            
                                                                                                  
 Conv7 (Conv1D)                 (None, 251, 256)     196864      ['Conv6[0][0]']                  
                                                                                                  
 Conv_pool_3 (Conv1D)           (None, 126, 64)      49216       ['Conv7[0][0]']                  
                                                                                                  
 Batchnorm_4 (BatchNormalizatio  (None, 126, 64)     256         ['Conv_pool_3[0][0]']            
 n)                                                                                               
                                                                                                  
 Conv8 (Conv1D)                 (None, 126, 512)     98816       ['Batchnorm_4[0][0]']            
                                                                                                  
 Conv9 (Conv1D)                 (None, 126, 512)     786944      ['Conv8[0][0]']                  
                                                                                                  
 Batchnorm_5 (BatchNormalizatio  (None, 126, 512)    2048        ['Conv9[0][0]']                  
 n)                                                                                               
                                                                                                  
 Conv_pool_4 (Conv1D)           (None, 63, 512)      786944      ['Batchnorm_5[0][0]']            
                                                                                                  
 Conv_pool_5 (Conv1D)           (None, 32, 512)      786944      ['Conv_pool_4[0][0]']            
                                                                                                  
 Conv_pool_6 (Conv1D)           (None, 16, 512)      786944      ['Conv_pool_5[0][0]']            
                                                                                                  
 Conv_pool_7 (Conv1D)           (None, 8, 512)       786944      ['Conv_pool_6[0][0]']            
                                                                                                  
 flatten (Flatten)              (None, 4096)         0           ['Conv_pool_7[0][0]']            
                                                                                                  
 lambda_1 (Lambda)              (1, 2)               0           ['input_layer[0][0]']            
                                                                                                  
 Concat_2 (Concatenate)         (1, 4098)            0           ['flatten[0][0]',                
                                                                  'lambda_1[0][0]']               
                                                                                                  
 fc1 (Dense)                    (1, 4098)            16797702    ['Concat_2[0][0]']               
                                                                                                  
 fc2 (Dense)                    (1, 4096)            16789504    ['fc1[0][0]']                    
                                                                                                  
 fc3 (Dense)                    (1, 3)               12291       ['fc2[0][0]']                    
                                                                                                  
==================================================================================================
Total params: 38,068,377
Trainable params: 38,066,833
Non-trainable params: 1,544
__________________________________________________________________________________________________
0 Answers
Related