Неправильная форма вывода плотного слоя после перехода от TF 1.12 к 1.10 - PullRequest
0 голосов
/ 19 января 2019

Я перехожу с Tensorflow 1.12 на Tensorflow 1.10 (Collaboratory -> AWS sagemaker), кажется, код работает нормально в Tensorflow 1.12, но в 1.10 я получаю ошибку ValueError: Error when checking target: expected dense to have 2 dimensions, but got array with shape (52692,)

Пример ввода - строки без пробелов:

["testAbc", "aaDD", "roam"]

, который я предварительно обработал, изменив маленькие буквы на 1, заглавные буквы 2, цифры - 3, '-' - 4, '_' - 5 и дополнив их так, чтобы они были равны длине с 0s

и 4 метки a - 0, b - 1, c - 2, d - 3

Предполагая, что максимальная длина каждого слова равна 10 (в моем коде это 20):

функции - [[1 1 1 1 2 1 1 0 0 0] [1 1 2 2 0 0 0 0 0 0] [1 1 1 1 0 0 0 0 0 0]]

этикетки - [1, 1, 2, 3]

ожидаемый выход: [a: 0%, b: 0%, c: 1%, d: 99%] (пример)

model = keras.Sequential()
model.add(
    keras.layers.Embedding(6, 8, input_length=maxFeatureLen))
model.add(keras.layers.LSTM(12))
model.add(keras.layers.Dense(4, activation=tf.nn.softmax))
model.compile(tf.train.AdamOptimizer(0.001), loss="sparse_categorical_crossentropy")
model.fit(train["featuresVec"],
            train["labelsVec"],
            epochs=1,
            verbose=1,
            callbacks=[],
            validation_data=(evale["featuresVec"], evale["labelsVec"],),
            validation_steps=evale["count"],
            steps_per_epoch=train["count"])

Формы поезда и уклонения - 2D массивы

train["featuresVec"]=
[[1 2 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0]
 [1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [2 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0]]

evale["featuresVec"]=
[[1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0]
 [1 1 1 1 1 1 2 1 1 1 1 1 0 0 0 0 0 0 0 0]
 [1 1 1 1 1 2 1 1 1 1 1 1 2 1 1 1 1 1 1 0]
 [1 1 1 1 1 2 1 1 1 1 1 2 1 1 1 1 1 1 0 0]
 [1 1 1 1 1 2 1 1 1 1 1 1 0 0 0 0 0 0 0 0]]

train["labelsVec"] = [1 0 0 0 2]
evale["labelsVec"] = [0 1 1 1 1]

Форма:

train["featuresVec"] = [52692, 20]
evale["featuresVec"] = [28916, 20]
train["labelsVec"] = [52692]
evale["labelsVec"] = [28916]

1 Ответ

0 голосов
/ 19 января 2019

Вероятно, ваш вектор меток должен иметь форму (batch_size, 1) вместо (batch_size,).

Примечание: Поскольку вы используете sparse_categorical_crossentropy в качестве функции потерь вместо categorical_crossentropy, правильно не кодировать метки одним щелчком.

...