Невозможно добавить два слоя в Keras из Tensorflow

#python #tensorflow #keras #neural-network #deep-learning

#python #tensorflow #keras #нейронная сеть #глубокое обучение

Вопрос:

У меня есть простая модель регрессии, как показано ниже. Слои layer_abc и layer_efg оба имеют (None, 5) в качестве выходных данных, поэтому их выходные данные имеют одинаковый размер и могут быть добавлены. Таким образом, я хочу отобразить код #keras.layers.Add()(['layer_abc', 'layer_efg']) . Но всякий раз, когда я делаю это, я получаю ошибку AttributeError: 'str' object has no attribute 'get_shape' . Если я не отображал эту строку, то код в порядке.

Как я могу добавить два слоя без ошибок? Большое спасибо!

 from __future__ import absolute_import, division, print_function
from scipy import misc
import tensorflow as tf
from tensorflow import keras
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPooling2D, BatchNormalization, Activation
import numpy as np
import matplotlib.pyplot as plt

train_images=np.array([[[0],[1],[2]],[[0],[0],[2]],[[1],[1],[1]],[[1],[0],[1]]])
train_labels=np.array([[1],[0],[1],[0]])

model = keras.Sequential([  
    keras.layers.Flatten(input_shape=(3, 1)),
    keras.layers.Dense(5, activation=tf.nn.relu,name='layer_abc'),
    keras.layers.Dense(5, activation=tf.nn.relu,name='layer_efg'),
    #keras.layers.Add()(['layer_abc', 'layer_efg']),
    keras.layers.Dense(1, activation=tf.nn.softmax),    
])

model.compile(optimizer='adam', 
              loss='mean_squared_error',
              metrics=['accuracy','mean_squared_error'])

print(model.summary())

model.fit(train_images, train_labels, epochs=2)
  

Комментарии:

1. Почему вам нужно объявлять их последовательно, просто чтобы сложить их вместе? Если слои абсолютно одинаковы, почему бы просто не вызвать плотный слой с 10 блоками?

2. Вам понадобится функциональный API, а затем используйте model.merge

3. @JimmyOnThePage Потому что в моей исходной модели layer_abc и layer_efg также разделены некоторыми другими слоями. Для простоты я просто помещаю их здесь в виде последовательных слоев, но это не так.

4. @anand_v.singh В моем случае здесь layer_abc и layer_efg не параллельны. layer_abc помещается перед layer_efg . Что я пытаюсь здесь сделать, так это создать ярлык, подобный ResNet ( oreilly.com/library/view/deep-learning-with/9781788624336 / … ). Я думаю, что model.merge в основном предназначен для параллельного добавления, но не для случая ярлыка?

5. Ярлыки не соответствуют последовательной модели. При использовании Sequential каждый слой является единственным входом для следующего. Слои не могут иметь несколько входных данных (хотя то, что находится внутри данного слоя, может быть не последовательным). layer_abc является общим, и вам нужно использовать функциональный API для общих слоев. Кроме того, не разрешается (или не рекомендуется) объединять две последовательные модели .

Ответ №1:

Вы можете использовать функциональный API, подобный этому, для выполнения добавления, для одиночного вывода между 0 и 1 используйте активацию sigmoid для вывода:

 input = keras.layers.Input((3,1))
x1 =  keras.layers.Dense(5, activation=tf.nn.relu, name='layer_abc')(input)
x2 =  keras.layers.Dense(5, activation=tf.nn.relu, name='layer_efg')(input)
x =  keras.layers.Add()([x1, x2])
x = keras.layers.Flatten()(x)
output = keras.layers.Dense(1, activation=tf.nn.sigmoid)(x)
model = keras.models.Model(input, output)
  

Это может сработать:

 model = keras.Sequential([
    keras.layers.Flatten(input_shape=(3, 1)),
    keras.layers.Dense(5, activation=tf.nn.relu,name='layer_abc'),
    keras.layers.Dense(5, activation=tf.nn.relu,name='layer_efg')])

model.add(keras.layers.Lambda(lambda x: tf.add(model.layers[1].output, x)))
model.add(keras.layers.Dense(1, activation=tf.nn.sigmoid))
  

Комментарии:

1. Спасибо за ваш ответ. Этот подход потребовал бы значительной работы по переписыванию исходной модели. Есть ли способ добавить их, все еще используя keras.Sequential([ ]) подход? Или я могу сделать это без создания новых переменных x1 и x2 ?