Объект 'Tensor' не имеет атрибута _keras_history

Я хотел извлечь и применить самостоятельно 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 ответ

Решение

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

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)
Другие вопросы по тегам