Вход в плоский слой должен быть тензором

У меня была следующая модель keras, которая работала нормально:

model = Sequential()
model.add(Flatten(input_shape=(1,1,68)))
model.add(Dense(35,activation='linear'))
model.add(LeakyReLU(alpha=.001))
model.add(Dense(nb_actions))
model.add(Activation('linear'))

Затем я попытался сделать что-то более сложное, как показано ниже:

model = Sequential()
input1 = keras.layers.Flatten(input_shape=(1,1,68))
x1 = keras.layers.Dense(68, activation='linear')(input1)
x2 = keras.layers.Dense(68, activation='relu')(input1)
x3 = keras.layers.Dense(68, activation='sigmoid')(input1)
add1 = keras.layers.Add()([x1, x2, x3])
activ1 = keras.layers.advanced_activations.LeakyReLU(add1)

x4 = keras.layers.Dense(34, activation='linear')(activ1)
x5 = keras.layers.Dense(34, activation='relu')(activ1)
x6 = keras.layers.Dense(34, activation='sigmoid')(activ1)
add2 = keras.layers.Add()([x4, x5, x6])
activ2 = keras.layers.advanced_activations.LeakyReLU(add2)

x7 = keras.layers.Dense(17, activation='linear')(activ2)
x8 = keras.layers.Dense(17, activation='relu')(activ2)
x9 = keras.layers.Dense(17, activation='sigmoid')(activ2)
add2 = keras.layers.Add()([x4, x5, x6])
activ3 = keras.layers.advanced_activations.LeakyReLU(add3)

final_layer=keras.layers.Dense(nb_actions, activation='linear')(activ3)
model = keras.models.Model(inputs=input1, outputs=final_layer)

Как вы можете видеть в приведенном выше коде, я сохраняю те же входные данные из слоя Flatten и просто суммирую слои с одинаковым количеством нейронов, но активированными по-разному. Моя проблема в том, что я пытаюсь запустить этот код. Я всегда получаю следующую ошибку:

Using TensorFlow backend. Traceback (most recent call last):   File "/home/anselmo/virtualenvironment/virtualenvironment_anselmo2/lib/python3.5/site-packages/keras/engine/base_layer.py", line 279, in assert_input_compatibility
    K.is_keras_tensor(x)   File "/home/anselmo/virtualenvironment/virtualenvironment_anselmo2/lib/python3.5/site-packages/keras/backend/tensorflow_backend.py", line 474, in is_keras_tensor
    str(type(x)) + '`. ' ValueError: Unexpectedly found an instance of type class keras.layers.core.Flatten. Expected a symbolic tensor instance.

During handling of the above exception, another exception occurred:

Traceback (most recent call last):   File "main.py", line 64, in <module>
    x1 = keras.layers.Dense(68, activation='linear')(input1)   File "/home/anselmo/virtualenvironment/virtualenvironment_anselmo2/lib/python3.5/site-packages/keras/engine/base_layer.py", line 414, in __call__
    self.assert_input_compatibility(inputs)   File "/home/anselmo/virtualenvironment/virtualenvironment_anselmo2/lib/python3.5/site-packages/keras/engine/base_layer.py", line 285, in assert_input_compatibility
    str(inputs) + '. All inputs to the layer ' ValueError: Layer dense_1 was called with an input that isn't a symbolic tensor. Received type: class keras.layers.core.Flatten. Full input: [keras.layers.core.Flatten object at 0x7f0a145d6438]. All inputs to the layer should be tensors.

Когда я запустил предыдущий код, ошибки не произошло. Так почему при изменении дизайна сети возникает эта ошибка? как я могу это решить? где здесь моя ошибка?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
0
938
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

То, что вы пытаетесь использовать во втором коде, представляет собой функциональную модель Keras, а не последовательную. Вы должны изменить первую строку с model = Sequential() на input1 = Input(shape=(1, 1, 68)).

Подробнее на официальная документация.

Ошибка исчезла. Теперь у меня другая ошибка: ValueError: установка элемента массива с последовательностью. Возможно, потому что я читаю данные с помощью Pandas. Могу ли я исправить это, используя тот же код, который я показал в этой теме? Благодарю.

mad 28.05.2019 10:49

Вы должны преобразовать свои данные в массивы numpy.

Anakin 28.05.2019 10:53

Спасибо за ваш комментарий. Однако ошибка возникает на уровне активации LeakyRelu (activ1 = keras.layers.advanced_activations.LeakyReLU(add1)), когда я удаляю эту часть кода, сеть работает нормально. Если вы можете мне помочь, я был бы признателен. В противном случае я могу открыть новую тему. Спасибо.

mad 28.05.2019 10:58

Я посмотрю, если вы можете показать мне ошибку с обратной трассировкой

Anakin 28.05.2019 11:04

Трассировка (последний последний вызов): Файл «main.py», строка 85, в <module> activ1 = keras.layers.advanced_activations.LeakyReLU(add1) Файл keras/layers/advanced_activations.py», строка 45, в в этом self .alpha = K.cast_to_floatx(alpha) Файл keras/backend/common.py", строка 110, в cast_to_floatx return np.asarray(x, dtype=_FLOATX) Файл "numpy/core/numeric.py", строка 501, в asarray возвращает массив (a, dtype, copy=False, order=order) ValueError: установка элемента массива с последовательностью. Без этого LeakyRelu код работает нормально :-(

mad 28.05.2019 11:15

Это потому, что ваш синтаксис неверен. Должно быть activ1 = keras.layers.advanced_activations.LeakyReLU(alpha=some_value‌​_in_float)(add1).

Anakin 28.05.2019 11:40

Другие вопросы по теме