Я настраиваю рекуррентную нейронную сеть для классификации слов между английским или французским, и я получаю ошибку о неправильной форме вывода.
Моя сеть выглядит так:
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
cu_dnnlstm_1 (CuDNNLSTM) (None, 45, 128) 79872
_________________________________________________________________
dropout_1 (Dropout) (None, 45, 128) 0
_________________________________________________________________
cu_dnnlstm_2 (CuDNNLSTM) (None, 128) 132096
_________________________________________________________________
dropout_2 (Dropout) (None, 128) 0
_________________________________________________________________
dense_1 (Dense) (None, 2) 258
=================================================================
Total params: 212,226
Trainable params: 212,226
Non-trainable params: 0
_________________________________________________________________
Вот моя ошибка:
ValueError: Ошибка при проверке цели: ожидается, что плотность_1 будет иметь форму (1,), но получен массив с формой (2,)
Вот мой код:
import pickle
import tensorflow as tf
import keras
from keras.backend.tensorflow_backend import set_session
config = tf.ConfigProto()
config.gpu_options.allow_growth = True
config.log_device_placement = 0
sess = tf.Session(config=config)
set_session(sess)
from keras.models import Sequential
from keras.layers import Dense, Dropout, LSTM, CuDNNLSTM
import numpy as np
maxlen = 45
learning_rate = 0.002
characters = 26
empty = [0 for _ in range(characters)]
model_name = "language_predictor"
batch_size = 64
n_epoch = 3
with open("data_x.pickle", "rb") as file:
x = pickle.load(file)
with open("data_y.pickle", "rb") as file:
y = pickle.load(file)
for sequence in x:
while len(sequence) < maxlen:
sequence.append(empty)
x = np.array(x)
y = np.array(y)
model = Sequential()
model.add(CuDNNLSTM(128, input_shape=(maxlen, characters), return_sequences=True))
model.add(Dropout(0.2))
model.add(CuDNNLSTM(128))
model.add(Dropout(0.2))
model.add(Dense(2, activation='softmax'))
# Compile model
model.compile(
loss='sparse_categorical_crossentropy',
optimizer=keras.optimizers.Adam(lr=0.002),
metrics=['accuracy'],
)
model.summary()
model.fit(x,
y,
epochs=n_epoch,
batch_size=batch_size,
validation_split=0.1)
Мои данные выглядят так: [ [ [one hot array of letter], [more], [more] ], [another word] ]
Мои выводы выглядят так: [ [0, 1 one hot array of language], [1, 0] ]
Всякий раз, когда я запускаю программу, я просто получаю эту ошибку:
ValueError: Error when checking target:
expected dense_1 to have shape (1,) but got array with shape (2,)
Несмотря на это, он должен работать, потому что выходной слой имеет 2 нейрона.
EDIT:
Изменение функции потерь с "sparse_categorical_crossentropy" на "categoryorical_crossentropy" решило проблему.