Керас Последовательная модель с несколькими входами - PullRequest
0 голосов
/ 19 марта 2019

Я делаю модель MLP, которая принимает два входа и производит один выход.

У меня есть два входных массива (по одному на каждый вход) и 1 выходной массив.Нейронная сеть имеет 1 скрытый слой с 2 ​​нейронами.Каждый массив состоит из 336 элементов.

model0 = keras.Sequential([
keras.layers.Dense(2, input_dim=2, activation=keras.activations.sigmoid, use_bias=True),
keras.layers.Dense(1, activation=keras.activations.relu, use_bias=True),
])

# Compile the neural network #
model0.compile(
    optimizer = keras.optimizers.RMSprop(lr=0.02,rho=0.9,epsilon=None,decay=0),
    loss = 'mean_squared_error',
    metrics=['accuracy']
)

Я пробовал два способа, оба из которых выдают ошибки.

model0.fit(numpy.array([array_1, array_2]),output, batch_size=16, epochs=100)

ValueError: Ошибка при проверке ввода: ожидается, что плотность записи будет иметьshape (2,), но получил массив с shape (336,)

Второй способ:

model0.fit([array_1, array_2],output, batch_size=16, epochs=100)

ValueError: Ошибка при проверке ввода модели: списокКучевые массивы, которые вы передаете своей модели, не соответствуют ожидаемому размеру.Предполагается увидеть 1 массив (ов), но вместо этого получил следующий список из 2 массивов:

Аналогичный вопрос .Но не используя последовательную модель.

Ответы [ 3 ]

1 голос
/ 19 марта 2019

Для решения этой проблемы у вас есть два варианта.

1. Использование последовательной модели

Вы можете объединить оба массива в один перед подачей в сеть. Давайте предположим, что два массива имеют форму (Number_data_points,), теперь массивы можно объединить с помощью метода numpy.stack.

merged_array = np.stack([array_1, array_2], axis=1)

model0 = keras.Sequential([
keras.layers.Dense(2, input_dim=2, activation=keras.activations.sigmoid, use_bias=True),
keras.layers.Dense(1, activation=keras.activations.relu, use_bias=True),
])

model0.fit(merged_array,output, batch_size=16, epochs=100)

2. Использование функционального API.

Это наиболее рекомендуемый способ использования при наличии нескольких входов в модель.

input1 = keras.layers.Input(shape=(1, ))
input2 = keras.layers.Input(shape=(1,))
merged = keras.layers.Concatenate(axis=1)([input1, input2])
dense1 = keras.layers.Dense(2, input_dim=2, activation=keras.activations.sigmoid, use_bias=True)(merged)
output = keras.layers.Dense(1, activation=keras.activations.relu, use_bias=True)(dense1)
model10 = keras.models.Model(inputs=[input1, input2], output=output)

Теперь вы можете использовать второй метод, который вы пытаетесь подогнать к модели

model0.fit([array_1, array_2],output, batch_size=16, epochs=100)

0 голосов
/ 19 марта 2019

Вышеуказанные решения содержат рекомендуемый подход, но я все еще получил некоторые ошибки. Поэтому я попробовал следующее.

for count in range (len(array_1)):
    input_array[count][0] = array_1[count]
    input_array[count][1] = array_2[count]

И Array_1, и Array_2 были одинаковой длины.

А затем создал и скомпилировал модель, как и раньше.

Наконец, для обучения я использовал:

model0.fit(input_array, output_array, batch_size=16, epochs=100, verbose=0)

Этот подход работал для меня.

0 голосов
/ 19 марта 2019

Как и в ответе, который вы связали, вы не можете использовать API Sequential по указанной причине.Вы должны использовать Model API, который также называется функциональным API.Архитектурно, вам нужно определить для модели, как вы будете комбинировать входные данные со слоем Dense, т.е. как вы хотите создать промежуточный слой, а именно.объединить / добавить или вычесть и т. д. / создать слой для встраивания и т. д.), или, может быть, вы хотите иметь 2 нейронные сети, по одной на каждый вход, и хотите объединить выходные данные только в последнем слое.Код для каждого из приведенных выше вариантов будет различным.

Вот рабочее решение, предполагающее, что вы хотите объединить входные данные в вектор формы 672, а затем построить нейронную сеть на этом входном сигнале:

import tensorflow as tf
from tensorflow.keras.layers import *
from tensorflow.keras.models import Sequential, Model
from tensorflow.keras.optimizers import Adam, RMSprop
import numpy as np

input1 = Input(shape=(336,))
input2 = Input(shape=(336,))
input = Concatenate()([input1, input2])
x = Dense(2)(input)
x = Dense(1)(x)
model = Model(inputs=[input1, input2], outputs=x)
model.summary()

Вы заметите, что эта модель объединяет или объединяет два входа, а затем создает нейронную сеть поверх этого:

Layer (type)                    Output Shape         Param #     Connected to                     
==================================================================================================
input_1 (InputLayer)            (None, 336)          0                                            
__________________________________________________________________________________________________
input_2 (InputLayer)            (None, 336)          0                                            
__________________________________________________________________________________________________
concatenate (Concatenate)       (None, 672)          0           input_1[0][0]                    
                                                                 input_2[0][0]                    
__________________________________________________________________________________________________
dense (Dense)                   (None, 2)            1346        concatenate[0][0]                
__________________________________________________________________________________________________
dense_1 (Dense)                 (None, 1)            3           dense[0][0]                      
==================================================================================================
Total params: 1,349
Trainable params: 1,349
Non-trainable params: 0

Если у вас есть какой-то другой предпочтительный способ создания промежуточного слоя, вам следуетзамените строку Concatenate на строку кода.

Затем вы можете скомпилировать и подогнать модель:

model.compile(
    optimizer = RMSprop(lr=0.02,rho=0.9,epsilon=None,decay=0),
    loss = 'mean_squared_error',
    metrics=['accuracy']
)


x1, x2 = np.random.randn(100, 336),np.random.randn(100, 336,)
y = np.random.randn(100, 1)
model.fit([x1, x2], y)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...