Объект 'Tensor' не имеет атрибута _keras_history - PullRequest
0 голосов
/ 03 октября 2018

Я хотел самостоятельно извлечь и применить слой Conv2D к столбцам моих входных тензоров, но после добавления кода:

accelerometer_input = Input(shape=(1400, 3))

for i in range(3):
    out = Lambda(lambda x: x[:,:, i:i+1])(accelerometer_input) # Extracting the ith channel
    out = K.expand_dims(out, axis=1)
    out = Conv2D(64, (30, 1), data_format="channels_first")(out)  
    branch_outputs.append(out)
out_put = K.concatenate(branch_outputs)

это дает мне ошибку в заголовке.Я думаю, что это из-за слоя Lambda или извлечения , который нельзя дифференцировать.

Но как мне обойтись без него?

1 Ответ

0 голосов
/ 03 октября 2018

Это потому, что вы непосредственно применяете бэкэнд-функцию (т. Е. K.expand_dims()) к тензору Keras (т. Е. out), и поэтому результатом будет тензор (а не тензор Keras).Фактически, Keras Tensor является расширенной версией Tensor и имеет дополнительные атрибуты (например, _keras_history), которые помогают Keras построить модель.Теперь, чтобы решить эту проблему, вам просто нужно поместить бэкэнд-функцию в слой Lambda, чтобы иметь в качестве выходного тензора Keras:

out = Lambda(lambda x: K.expand_dims(x, axis=1))(out)

То же самое относится к использованию K.concatenate().Однако в этом случае в Keras есть специальный слой для него:

from keras.layers import concatenate, Concatenate

# use functional interface
out_put = concatenate(branch_outputs)

# or use layer class
out_put = Concatenate()(branch_outputs)
...