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
__________________________________________________________________________________________________