Объединить ввод с постоянным вектором в keras

Я пытаюсь объединить свой ввод с постоянным тензором в API функции keras-2. В моей реальной проблеме константы зависят от некоторых параметров в настройке, но я думаю, что приведенный ниже пример показывает ошибку, которую я получаю.

from keras.layers import*
from keras.models import *
from keras import backend as K
import numpy as np

a = Input(shape=(10, 5))
a1 = Input(tensor=K.variable(np.ones((10, 5))))
x = [a, a1]  # x = [a, a] works fine
b = concatenate(x, 1)
x += [b]  # This changes b._keras_history[0].input
b = concatenate(x, 1)
model = Model(a, b)

Я получаю следующее сообщение об ошибке:

ValueError                                Traceback (most recent call last)
~/miniconda3/envs/ds_tools/lib/python3.6/site-packages/keras/engine/topology.py in assert_input_compatibility(self, inputs)
    418             try:
--> 419                 K.is_keras_tensor(x)
    420             except ValueError:

~/miniconda3/envs/ds_tools/lib/python3.6/site-packages/keras/backend/theano_backend.py in is_keras_tensor(x)
    198                           T.sharedvar.TensorSharedVariable)):
--> 199         raise ValueError('Unexpectedly found an instance of type `' + str(type(x)) + '`. '
    200                          'Expected a symbolic tensor instance.')

ValueError: Unexpectedly found an instance of type `<class 'theano.gpuarray.type.GpuArraySharedVariable'>`. Expected a symbolic tensor instance.

During handling of the above exception, another exception occurred:

ValueError                                Traceback (most recent call last)
<ipython-input-2-53314338ab8e> in <module>()
      5 a1 = Input(tensor=K.variable(np.ones((10, 5))))
      6 x = [a, a1]
----> 7 b = concatenate(x, 1)
      8 x += [b]  # This changes b._keras_history[0].input
      9 b = concatenate(x, 1)

~/miniconda3/envs/ds_tools/lib/python3.6/site-packages/keras/layers/merge.py in concatenate(inputs, axis, **kwargs)
    506         A tensor, the concatenation of the inputs alongside axis `axis`.
    507     """
--> 508     return Concatenate(axis=axis, **kwargs)(inputs)
    509 
    510 

~/miniconda3/envs/ds_tools/lib/python3.6/site-packages/keras/engine/topology.py in __call__(self, inputs, **kwargs)
    550                 # Raise exceptions in case the input is not compatible
    551                 # with the input_spec specified in the layer constructor.
--> 552                 self.assert_input_compatibility(inputs)
    553 
    554                 # Collect input shapes to build layer.

~/miniconda3/envs/ds_tools/lib/python3.6/site-packages/keras/engine/topology.py in assert_input_compatibility(self, inputs)
    423                                  'Received type: ' +
    424                                  str(type(x)) + '. Full input: ' +
--> 425                                  str(inputs) + '. All inputs to the layer '
    426                                  'should be tensors.')
    427 

ValueError: Layer concatenate_2 was called with an input that isn't a symbolic tensor. Received type: <class 'theano.gpuarray.type.GpuArraySharedVariable'>. Full input: [concatenate_1/input_3, concatenate_1/variable]. All inputs to the layer should be tensors.

Я использую версию keras 2.0.5 с бэкэндом theano, с версией theano 0.10.0dev1. Есть идеи о том, что происходит не так, или о более правильном способе выполнения конкатенации?


person kgully    schedule 24.06.2017    source источник
comment
Вот полный рабочий пример: stackoverflow.com/a/68350241/10375049   -  person Marco Cerliani    schedule 12.07.2021


Ответы (1)


Размеры в керасе работают так:

  • Когда вы определяете их в слоях при построении вашей модели, вы никогда не определяете "batch_size".
  • Внутренне, используя внутренние функции, в функциях потерь и в любой тензорной операции, размер пакета является первым.

Keras показывает None, чтобы представить размер пакета в сводках, ошибках и т. Д.

Это означает, что:

  • Форма a - (Нет, 10, 5)
  • Форма a1 равна (10,5). Вы не можете объединить их.

Есть несколько обходных путей, например, создание a1 с shape (1,10,5) и последующее повторение его значений в пакетном измерении:

constant=K.variable(np.ones((1,10, 5)))
constant = K.repeat_elements(constant,rep=batch_size,axis=0)

Я совершенно не мог использовать Input(tensor=...), потому что размер константы фиксированный, а размер входа - None, поэтому я работал над этим с помощью лямбда-слоя:

b = Lambda(lambda x: K.concatenate([x,constant],axis=1),output_shape=(20,5))(a)

Но я вообще не могу понять, чего вы хотите достичь с x += [b] и остальными.

person Daniel Möller    schedule 25.06.2017
comment
Спасибо за подробный ответ. Мне нужны формы (10,5), а не (Нет, 10, 5), но я могу перевести то, что вы написали. - person kgully; 26.06.2017
comment
Вам нужно (None, 10,5), иначе он будет просто несовместим с моделью. Когда вы говорите input_shape=(10,5), вы определенно создаете (None,10,5) форму. Вот как работает керас. - person Daniel Möller; 26.06.2017
comment
Верно, определение ввода в моем коде было неправильным. Это должно быть inp = Input(shape=(5,)), но я не уловил этого, потому что он выдал ошибку еще до проверки форм. - person kgully; 26.06.2017
comment
Я создал аналогичный вопрос в основном потому, что не мог сопоставить этот ответ со своим вопросом, вероятно, из-за моей неопытности. Я был бы очень признателен, если бы вы могли взглянуть на мой вопрос. stackoverflow .com / questions / 58158620 / - person grabbag; 30.09.2019