Тензорный поток принимает размер данных (форму) как динамический и, таким образом, вызывает ошибки во время уплотнения узлов - PullRequest
0 голосов
/ 23 мая 2018

Я тренирую модель с формой объекта [3751,4], и я хотел бы использовать функцию изменения формы и плотного слоя, встроенную в Tensorflow, чтобы выходные метки имели форму [1,6].

Набор для обучения и тестирования очень похож, единственное отличие состоит в том, что набор данных для тестирования содержит меньше пакетов, чем набор для обучения.

Теперь у меня есть два скрытых слоя в моей модели, которые будут выполнять что-то вроде:

input_layer = tf.reshape(features["x"], [1,-1])
first_hidden_layer = tf.layers.dense(input_layer, 4, activation=tf.nn.relu)
second_hidden_layer = tf.layers.dense(first_hidden_layer, 5, activation=tf.nn.relu)
output_layer = tf.layers.dense(second_hidden_layer, 6, activation=tf.nn.relu)

Эта структура сети является функцией, которую используют как этап обучения, так и этап оценки.

Частичный код для обучения выглядит так:

 nn = tf.estimator.Estimator(model_fn=model_fn, params=model_params, model_dir='/tmp/nmos_self_define')

  train_input_fn = tf.estimator.inputs.numpy_input_fn(
      x={"x": train_features_numpy},
      y=train_labels_numpy,
      batch_size = 3751,
      num_epochs=None,
      shuffle=False)

  # Train
  nn.train(input_fn=train_input_fn, max_steps=5000)

И часть тестирования похожа на:

test_input_fn = tf.estimator.inputs.numpy_input_fn(
      x={"x": test_features_numpy},
      y=test_labels_numpy,
      batch_size = 3751,
      num_epochs= 1,
      shuffle=False)

  ev = nn.evaluate(input_fn=test_input_fn)
  print("Loss: %s" % ev["loss"])
  print("Root Mean Squared Error: %s" % ev["rmse"])

Во время обучения нет проблем, функция может изменить формувходные данные и сделать плотную часть.Однако во время тестирования тензорная форма функции изменения формы дает что-то вроде [1,?], Что отличается от фазы обучения ([1,15004]).И это привело к сбою функций tf.layers.dense, потому что он не может выполнить плотное вычисление, не зная действительной формы тензора.

Единственное различие между обучением и тестированием с моей точки зрения - это num_epochs, но это не должноне влияет на форму ввода правильно?Я не понимаю, почему Tensorflow может преобразовывать тензор с твердыми значениями во время обучения, в то время как он думает, что набор входных данных тестирования является динамическим?

Пожалуйста, помогите и спасибо, что нашли время, читая мой вопрос.

1 Ответ

0 голосов
/ 24 мая 2018

То, что вы делаете, это сглаживает ввод нескольких пакетов в один вектор пространственных объектов размером 15004. Скорее всего, вы пытаетесь добиться того, чтобы уменьшить размер вашего объекта до двухмерного вектора с формой (Пакеты, Nr Элементы), где Пакеты является динамическим.Есть два распространенных способа сделать это.Проще всего использовать плоский слой из tf.contrib следующим образом:

input_layer = tf.contrib.layers.flatten(features["x"])

, или вы можете изменить форму таким образом, чтобы размер партии был все еще динамичным, но тогда вам нужно вычислить форму вашеговведите как это:

num_dimensions = features["x"].shape.as_list[1] * features["x"].shape.as_list[2] ...
input_layer = tf.reshape(features["x"], [-1, num_dimensions])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...