Что вызывает «ValueError: Ошибка при проверке цели: ожидается, что плотность_2 имеет 2 измерения, но получен массив с формой (30, 1, 166)»? - PullRequest
0 голосов
/ 27 апреля 2019

Я попытался адаптировать код для распознавания чисел из mnist к задаче генерации текста.Я получаю ошибку значения:

ValueError: Error when checking target: expected dense_2 to have 2 dimensions, but got array with shape (30, 1, 166)

Как сделать так, чтобы конечный слой соответствовал этой выходной форме?

Я разделил некоторые текстовые данные на предложения.x_train и x_test - это грязные предложения, созданные с помощью программного обеспечения OCR, y_train и y_test - это те же предложения, но с проверкой и исправлением вручную.Я хочу обучить модель видеть общие ошибки и исправлять их.

Я искал решения этой проблемы здесь и на других сайтах.Наиболее распространенное решение, которое, кажется, работает для людей, использует loss='sparse_categorical_crossentropy', но я уже использую это.

Вот код, который я использую:

# Import test and train sets
test_in = open("test.pkl", "rb")
test_set = pickle.load(test_in)
train_in = open("train.pkl", "rb")
train_set = pickle.load(train_in)
x_test, y_test = test_set[0], test_set[1]
x_train, y_train = train_set[0], train_set[1]

# Map all characters in both sets
chars = sorted(list(set("".join(x_train + y_train + x_test + y_test))))
chardict = dict((c, i + 1) for i, c in enumerate(chars))
rchardict = dict((i + 1, c) for i, c in enumerate(chars))

# Encode lists using mapping
temp_list = list()
for gloss in x_test:
    encoded_gloss = [chardict[char] for char in gloss]
    temp_list.append(encoded_gloss)
x_test = temp_list
temp_list = list()
for gloss in y_test:
    encoded_gloss = [chardict[char] for char in gloss]
    temp_list.append(encoded_gloss)
y_test = temp_list
temp_list = list()
for gloss in x_train:
    encoded_gloss = [chardict[char] for char in gloss]
    temp_list.append(encoded_gloss)
x_train = temp_list
temp_list = list()
for gloss in y_train:
    encoded_gloss = [chardict[char] for char in gloss]
    temp_list.append(encoded_gloss)
y_train = temp_list

# Pad all sentences
max_len = max([len(x) for x in x_train + y_train + x_test + y_test])
x_test = np.array(pad_sequences(x_test, maxlen=max_len, padding='post'))
x_test = np.reshape(x_test, (x_test.shape[0], 1, x_test.shape[1]))
y_test = np.array(pad_sequences(y_test, maxlen=max_len, padding='post'))
y_test = np.reshape(y_test, (y_test.shape[0], 1, y_test.shape[1]))
x_train = np.array(pad_sequences(x_train, maxlen=max_len, padding='post'))
x_train = np.reshape(x_train, (x_train.shape[0], 1, x_train.shape[1]))
y_train = np.array(pad_sequences(y_train, maxlen=max_len, padding='post'))
y_train = np.reshape(y_train, (y_train.shape[0], 1, y_train.shape[1]))

# Normalise to improve training speed
x_test = x_test/37.0
x_train = x_train/37.0

# Define the model
model = Sequential()
model.add(LSTM(128, input_shape=(x_test.shape[1:]), activation='relu', return_sequences=True))
model.add(Dropout(0.2))
model.add(LSTM(128, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(32, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(10, activation='softmax'))
opt = Adam(lr=1e-3, decay=1e-5)

# Compile and fit the model
model.compile(loss='sparse_categorical_crossentropy', optimizer=opt, metrics=['accuracy'])
model.fit(x_test, y_test, epochs=5, validation_data=(x_train, y_train))

I 'Я хотел бы иметь возможность обучать модель так, чтобы я мог попробовать ее на невидимых предложениях и посмотреть, подходит ли она, но я не могу преодолеть это препятствие.

Изменить, чтобы включить полный возврат:

Traceback (most recent call last):
  File "/Users/adrian/PycharmProjects/WurzburgGlossParser/Rough Work.py", line 80, in <module>
    model.fit(x_test[:30], y_test[:30], epochs=5, validation_data=(x_test[30:40], y_test[30:40]))
  File"/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/keras/engine/training.py", line 952, in fit
    batch_size=batch_size)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/keras/engine/training.py", line 789, in _standardize_user_data
    exception_prefix='target')
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/keras/engine/training_utils.py", line 128, in standardize_input_data
    'with shape ' + str(data_shape))
ValueError: Error when checking target: expected dense_2 to have 2 dimensions, but got array with shape (30, 1, 166)

1 Ответ

2 голосов
/ 27 апреля 2019

Вам необходимо удалить размер размера 1 с ваших ярлыков:

y_test = np.squeeze(y_test, axis=1)
y_train = np.squeeze(y_train, axis=1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...