Skip to content Skip to sidebar Skip to footer

How To Use Reshape Keras Layer With Two None Dimension?

I have a keras 3D/2D model. In this model a 3D layer has a shape of [None, None, 4, 32]. I want to reshape this into [None, None, 128]. However, if I simply do the following: resh

Solution 1:

You can use K.shape to get the shape of your input (as a tensor) and wrap the reshaping in a Lambda layer as follows:

defreshape(x):
    x_shape = K.shape(x)
    new_x_shape = K.concatenate([x_shape[:-2], [x_shape[-2] * x_shape[-1]]])
    return K.reshape(x, new_x_shape)

reshaped = Lambda(lambda x: reshape(x))(x)
reshaped.set_shape([None, None, None, a * b]) # when x is of shape (None, None, a, b)

This will reshape a tensor with shape (None, None, a, b) to (None, None, a * b).

Solution 2:

Digging into the base_layer.py, I have found that reshaped is:

tf.Tensor 'lambda_1/Reshape:0' shape=(?, ?, ?, 128) dtype=float32.

However its atribute "_keras_shape" is (None, None, None, None) even after the set_shape. Therefore, the solution is to set this attribute:

defreshape(x):
    x_shape = K.shape(x)
    new_x_shape = K.concatenate([x_shape[:-2], [x_shape[-2] * x_shape[-1]]])
    return K.reshape(x, new_x_shape)

reshaped = Lambda(lambda x: reshape(x))(x)
reshaped.set_shape([None, None, None, 128])
reshaped.__setattr__("_keras_shape", (None, None, None, 128))
conv_x = Conv2D(16, (1,1))(reshaped)

Solution 3:

Since you are reshaping the best you can obtain from (4,32), without losing dimensions, is either (128, 1) or (1, 128). Thus you can do the following:

# original has shape [None, None, None, 4, 32] (including batch)reshaped_layer = Reshape((-1, 128))(original) # shape is [None, None, 128]conv_layer = Conv2D(16, (1,1))(K.expand_dims(reshaped_layer, axis=-2)) # shape is [None, None, 1, 16]

Post a Comment for "How To Use Reshape Keras Layer With Two None Dimension?"