Не может взять длину Shape с неизвестным рангом - PullRequest
0 голосов
/ 03 декабря 2018

У меня есть нейронная сеть из генератора данных tf.data и модели tf.keras следующим образом (упрощенная версия, поскольку она будет слишком длинной):

dataset = ...

Объект tf.data.Dataset, который с помощью метода next_x вызывает get_next для итератора x_train, а для метода next_y вызывает get_next для итератора y_train.Каждая метка представляет собой массив (1, 67) в формате «один горячий».

Слои:

input_tensor = tf.keras.layers.Input(shape=(240, 240, 3))  # dim of x
output = tf.keras.layers.Flatten()(input_tensor)
output= tf.keras.Dense(67, activation='softmax')(output)  # 67 is the number of classes

Модель:

model = tf.keras.models.Model(inputs=input_tensor, outputs=prediction)
model.compile(optimizer=tf.train.AdamOptimizer(), loss=tf.losses.softmax_cross_entropy, metrics=['accuracy'])
model.fit_generator(gen(dataset.next_x(), dataset.next_y()), steps_per_epochs=100)

gen определяется следующим образом:

def gen(x, y):
    while True:
        yield(x, y)

Моя проблема в том, что когда я пытаюсь запустить его, я получаю сообщение об ошибке в model.fit части:

ValueError: Cannot take the length of Shape with unknown rank.

Любые идеи приветствуются!

Ответы [ 2 ]

0 голосов
/ 08 февраля 2019

Я узнал, что случилось.На самом деле мне нужно run следующую партию в tf.Session перед тем, как ее получить.Вот как это работает (я не пишу остальную часть кода, поскольку он остается прежним):

model.fit_generator(gen(), steps_per_epochs=100)

def gen():
    with tf.Session() as sess:
        next_x = dataset.next_x()
        next_y = dataset.next_y()
        while True:
            x_batch = sess.run(next_x)
            y_batch = sess.run(next_y)
            yield x_batch, y_batch
0 голосов
/ 26 декабря 2018

Не могли бы вы опубликовать более длинный след стека?Я думаю, что ваша проблема может быть связана с этой недавней проблемой тензорного потока:

https://github.com/tensorflow/tensorflow/issues/24520

Есть также простой PR, который исправляет это (еще не объединено).Может быть, попробовать самим?

РЕДАКТИРОВАТЬ

Вот PR: открыть tensorflow/python/keras/engine/training_utils.py

заменить следующее (строка 232 на данный момент):

  if (x.shape is not None
      and len(x.shape) == 1

с этим:

  if tensor_util.is_tensor(x):
    x_shape_ndims = x.shape.ndims if x.shape is not None else None
  else:
    x_shape_ndims = len(x.shape)

  if (x_shape_ndims == 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...