Как использовать слой Reshape Keras с двумя измерениями None? - PullRequest
0 голосов
/ 04 марта 2019

У меня есть керас 3D / 2D модель.В этой модели трехмерный слой имеет форму [Нет, Нет, 4, 32].Я хочу изменить это в [None, None, 128].Однако, если я просто сделаю следующее:

reshaped_layer = Reshape ((- 1, 128)) (my_layer)

my_layer имеет форму [Нет, 128] и поэтому я не могу применить впоследствии любую 2D-свертку, как:

conv_x = Conv2D (16, (1,1)) (reshaped_layer)

Я пробовалиспользовать tf.shape (my_layer) и tf.reshape, но я не смог скомпилировать модель, поскольку tf.reshape не является слоем Keras.

Просто чтобы уточнить, я использую каналы в последнюю очередь;это не тф.керас, это просто керас.Здесь я отправляю отладку функции изменения формы: Reshape in keras

Это то, что я делаю сейчас, следуя совету anna-krogager:

def reshape(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])
conv_x = Conv2D(16, (1,1))(reshaped)

Я получаю следующееerror: ValueError: Размер канала должен быть определен.Не найдено

Debug, keras reshape

Ответы [ 2 ]

0 голосов
/ 04 марта 2019

Копаясь в base_layer.py, я обнаружил, что изменение формы:

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

Однако его атрибут "_keras_shape" равен (None, None, None, None) даже после set_shape.Поэтому решение состоит в том, чтобы установить этот атрибут:

def reshape(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)
0 голосов
/ 04 марта 2019

Вы можете использовать K.shape, чтобы получить форму вашего ввода (в качестве тензора) и обернуть изменение формы в слой Lambda следующим образом:

def reshape(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)

Это изменит форму тензора с формой (None, None, a, b) до (None, None, a * b).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...