Вход 0 слоя lstm_9 несовместим со слоем: ожидаемый ndim = 3, найденный ndim = 4. Получена полная форма: [Нет, 2, 4000, 256] - PullRequest
1 голос
/ 29 апреля 2020

Я пытаюсь создать модель с сетью RNN, но получаю: Вход 0 слоя lstm_9 несовместим со слоем: ожидаемый ndim = 3, найденный ndim = 4. Получена полная форма: ошибка [Нет, 2, 4000, 256].

ВХОД

train_data.shape() = (100,2,4000)

train_labels.shape() =(100,)

labels_values = 0 or 1 (two classes)

МОДЕЛЬ

input = Input(shape=(2,4000)) # shape from train_data
embedded = Embedding(2, 256)(input) 
lstm = LSTM(1024, return_sequences=True)(embedded) # ERROR
dense = Dense(2, activation='softmax')(lstm) 

1 Ответ

1 голос
/ 29 апреля 2020

Ваша концепция проектирования функциональных моделей Keras с внедренными слоями, к сожалению, неверна.

  1. Когда вы используете слой внедрения, он ожидает двухмерные данные.
Input shape

2D tensor with shape: (batch_size, sequence_length).

Output shape

3D tensor with shape: (batch_size, sequence_length, output_dim).

Ссылка: https://keras.io/layers/embeddings/

Требуется последовательность идентификаторов или токенов для словаря. Это должен быть целочисленный массив.

Допустим, у нашего словаря есть len 36, мы передаем ему список целочисленных массивов в диапазоне (0, 36)

[1, 34, 32, 23 ] действителен [0,2, 0,5] недействителен

Обычно мы используем Embedding для представления векторов в уменьшенном пространстве, поэтому output_dim ниже, чем input_dim, но в зависимости от дизайна может быть и обратное.

You необходимо указать input_length для входных данных.

Если вы используете return_sequences = True, временное измерение будет передано следующему измерению, в вашем случае это нежелательно.

У вас есть метки в форме (0, 1, 0, 1, 0, 0, ...), а не в форме с горячим кодированием, поэтому не используйте softmax, а сигмоид с 1 единица в последнем плотном.

Это несколько исправленная сеть.

from tensorflow.keras.layers import *
from tensorflow.keras.models import *
import numpy as np
train_data = np.random.randint(0,3, (100, 4000))
y_labels = np.random.randint(0,2, (100,))

input_ = Input(shape=(4000)) # shape from train_data
embedded = Embedding(36, 256, input_length = 4000)(input_) 
lstm = LSTM(256, return_sequences=False)(embedded) # --> ERROR
dense = Dense(1, activation='softmax')(lstm) 

model = Model(input_, dense)
model.summary()
Model: "model"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_6 (InputLayer)         [(None, 4000)]            0         
_________________________________________________________________
embedding_5 (Embedding)      (None, 4000, 256)         9216      
_________________________________________________________________
lstm_5 (LSTM)                (None, 256)               525312    
_________________________________________________________________
dense (Dense)                (None, 1)                 257       
=================================================================
Total params: 534,785
Trainable params: 534,785
Non-trainable params: 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...