Как работать с трехмерным вводом слов в Керасе - PullRequest
0 голосов
/ 02 мая 2019

Я хочу реализовать word2vec с помощью Keras. Вот как я подготовил свои тренировочные данные:

encoded = tokenizer.texts_to_sequences(data)
sequences = list()
for i in range(1, len(encoded)):
    sent = encoded[i]
    _4grams = list(nltk.ngrams(sent, n=4))
    for gram in _4grams:
        sequences.append(gram)

# split into X and y elements
sequences = np.array(sequences)

X, y = sequences[:, 0:3], sequences[:, 3]
X = to_categorical(X, num_classes=vocab_size)
y = to_categorical(y, num_classes=vocab_size)

Xtrain, Xtest, Ytrain, Ytest = train_test_split(X, y, test_size=0.3, random_state=42)

Вот моя модель в Керасе:

model = Sequential()
model.add(Dense(50, input_shape=Xtrain.shape))
model.add(Dense(Ytrain.shape[1]))
model.add(Activation("softmax"))

Xtrain (6960, 3, 4048)
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense_22 (Dense)             (None, 6960, 3, 50)       202450    
_________________________________________________________________
dense_23 (Dense)             (None, 6960, 3, 4048)     206448    
_________________________________________________________________
activation_10 (Activation)   (None, 6960, 3, 4048)     0         
=================================================================
Total params: 408,898
Trainable params: 408,898
Non-trainable params: 0
_________________________________________________________________
None

Я получил ошибку:

history = model.fit(Xtrain, Ytrain, epochs=10, verbose=1, validation_data=(Xtest, Ytest))

Error when checking input: expected dense_22_input to have 4 dimensions, but got array with shape (6960, 3, 4048)

Я не знаю, как подготовить и передать данные о тренировках в нейронную сеть Keras?

1 Ответ

0 голосов
/ 02 мая 2019

Форма ввода в кератах необязательно подразумевает форму набора входных данных. Форма ввода - это форма отдельной точки данных в наборе данных (форма набора данных без измерения пакета). Но вы указываете форму ввода, которая будет формой ввода набора данных, включая размер пакета. Правильная форма ввода в вашем случае будет Xtrain.shape[1:].

model = Sequential()
model.add(Dense(50, input_shape=Xtrain.shape[1:]))
model.add(Dense(Ytrain.shape[1]))
model.add(Activation("softmax"))
...