Данные входных данных не имеют правильной формы для модели RNN. Как это исправить? - PullRequest
0 голосов
/ 19 октября 2019

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

ES: X1, X2,.., Xn // серия
Y = Xn + 1

Входные данные - это вложения предложений Джобса. Для каждой работы у меня есть вектор с 4196 элементами. Я создал свой набор данных из списка DataFrame, который содержит два столбца: UserID , JobPosting . Каждая таблица содержит только одного пользователя, поэтому этот столбец будет отброшен, а задания предварительно преобразованы во вложения. Код, который создает X и Y:

dataset = []    # Where I want store X
Y_dataset = []  # Where I want store Y
i=0

#test is a numpy array and each element is DataFrame containing
#UserID and JobTitle (The embeddings of them)
for table in test:

  # Now I keep only JobTitles and I turn it to a ndarray
  tmp = table.drop(columns=['UserID'])['JobTitle'].values

  # I take out the last value from table. It's gona be my Y
  y = table.tail(1)['JobTitle'].values.tolist()
  t = []
  for v in tmp:
    if type(v) != str and len(v) == 4196:  # Just a check
      t.append(v)
  dataset.append(t)
  Y_dataset.append(y[0])
  i += 1

Теперь у меня есть два набора данных: набор данных и Y_dataset После этого я разделил их на Train, dev инабор тестов:

size = len(dataset)

split_point = size / 3 * 2

full_train_set, test_set = dataset[:int(split_point)],    dataset[int(split_point):]
full_Y, test_Y = Y_dataset[:int(split_point)], Y_dataset[int(split_point):]


train_size = len(full_train_set)

split_point = train_size / 100 * 10
dev_set, train_set = full_train_set[:int(split_point)],    full_train_set[int(split_point):] 
dev_Y, train_Y = full_Y[:int(split_point)], full_Y[int(split_point):] 
print("Traing Set Size: " + str(len(train_set)))
print("Dev Set Size: " + str(len(dev_set)))
print("Test Set Size: " + str(len(test_set)))

Теперь я создаю свою модель следующим образом:

embeds_size = 4196

model = keras.models.Sequential()
model.add(keras.layers.SimpleRNN(1024, input_shape=(None,embeds_size), activation='relu'))
model.add(keras.layers.Dense(4196, activation='softmax'))

model.build()
model.summary()

Я скомпилировал с adam и kullback_leibler_divergence as Lossфункция. Но когда я пытаюсь начать поезд:

model.fit(train_set, train_Y, epochs=50, batch_size=100)

Ошибка возникает

ValueError: Error when checking input: expected simple_rnn_23_input to have 3 dimensions, but got array with shape (7, 4196)

Не могли бы вы объяснить, почему это происходит? Спасибо:)

...