Ввод переменной длины для CRNN с тензорным потоком - PullRequest
0 голосов
/ 04 марта 2020

Я использую tenorflow 2.x (2.2.0-dev20200228) с tf.keras. Моя первоначальная проблема заключается в том, что слой Conv2d не поддерживает маскирование, поэтому я ищу обходной путь для обучения с вводом переменной длины.

Поэтому, в конце концов, я хотел бы использовать input_time_size = None. Насколько я понимаю, для этого я должен использовать tf.shape. Однако, когда я это делаю, я получаю сообщение об ошибке (см. Ниже), даже при использовании фиксированного input_time_size = 20. Использование model.output.shape вместо этого работает. Любой совет будет очень кстати.

Обратите внимание, что код представляет упрощенную net для простоты.

import tensorflow as tf


num_filters = 1
input_time_size = 20
input_frequency_size = 10

model = tf.keras.Sequential()

model.add(tf.keras.layers.Input(shape=(input_time_size, input_frequency_size, 1)))

model.add(tf.keras.layers.Conv2D(filters=num_filters, kernel_size=(10, 4), strides=[2, 1]))

conv_output_height = tf.shape(model.output)[1]
conv_output_width = tf.shape(model.output)[2]

# this works, but want to use input_time_size = None
#conv_output_height = model.output.shape[1]
#conv_output_width = model.output.shape[2]

model.add(tf.keras.layers.Reshape(target_shape=(conv_output_height, conv_output_width * num_filters)))

model.add(tf.keras.layers.RNN(cell=tf.keras.layers.GRUCell(units=1), stateful=False))

model.add(tf.keras.layers.Dense(units=1))

model.compile()

Traceback:

Traceback (most recent call last):
  File "test.py", line 23, in <module>
    model.add(tf.keras.layers.RNN(cell=tf.keras.layers.GRUCell(units=1), stateful=False))
  File "/home/test/.local/lib/python3.6/site-packages/tensorflow/python/training/tracking/base.py", line 456, in _method_wrapper
    result = method(self, *args, **kwargs)
  File "/home/test/.local/lib/python3.6/site-packages/tensorflow/python/keras/engine/sequential.py", line 213, in add
    output_tensor = layer(self.outputs[0])
  File "/home/test/.local/lib/python3.6/site-packages/tensorflow/python/keras/layers/recurrent.py", line 652, in __call__
    return super(RNN, self).__call__(inputs, **kwargs)
  File "/home/test/.local/lib/python3.6/site-packages/tensorflow/python/keras/engine/base_layer.py", line 896, in __call__
    self._maybe_build(inputs)
  File "/home/test/.local/lib/python3.6/site-packages/tensorflow/python/keras/engine/base_layer.py", line 2403, in _maybe_build
    self.build(input_shapes)  # pylint:disable=not-callable
  File "/home/test/.local/lib/python3.6/site-packages/tensorflow/python/keras/layers/recurrent.py", line 571, in build
    self.cell.build(step_input_shape)
  File "/home/test/.local/lib/python3.6/site-packages/tensorflow/python/keras/utils/tf_utils.py", line 315, in wrapper
    output_shape = fn(instance, input_shape)
  File "/home/test/.local/lib/python3.6/site-packages/tensorflow/python/keras/layers/recurrent.py", line 1747, in build
    caching_device=default_caching_device)
  File "/home/test/.local/lib/python3.6/site-packages/tensorflow/python/keras/engine/base_layer.py", line 576, in add_weight
    caching_device=caching_device)
  File "/home/test/.local/lib/python3.6/site-packages/tensorflow/python/training/tracking/base.py", line 743, in _add_variable_with_custom_getter
    **kwargs_for_getter)
  File "/home/test/.local/lib/python3.6/site-packages/tensorflow/python/keras/engine/base_layer_utils.py", line 141, in make_variable
    shape=variable_shape if variable_shape else None)
  File "/home/test/.local/lib/python3.6/site-packages/tensorflow/python/ops/variables.py", line 259, in __call__
    return cls._variable_v1_call(*args, **kwargs)
  File "/home/test/.local/lib/python3.6/site-packages/tensorflow/python/ops/variables.py", line 220, in _variable_v1_call
    shape=shape)
  File "/home/test/.local/lib/python3.6/site-packages/tensorflow/python/ops/variables.py", line 198, in <lambda>
    previous_getter = lambda **kwargs: default_variable_creator(None, **kwargs)
  File "/home/test/.local/lib/python3.6/site-packages/tensorflow/python/ops/variable_scope.py", line 2598, in default_variable_creator
    shape=shape)
  File "/home/test/.local/lib/python3.6/site-packages/tensorflow/python/ops/variables.py", line 263, in __call__
    return super(VariableMetaclass, cls).__call__(*args, **kwargs)
  File "/home/test/.local/lib/python3.6/site-packages/tensorflow/python/ops/resource_variable_ops.py", line 1434, in __init__
    distribute_strategy=distribute_strategy)
  File "/home/test/.local/lib/python3.6/site-packages/tensorflow/python/ops/resource_variable_ops.py", line 1567, in _init_from_args
    initial_value() if init_from_fn else initial_value,
  File "/home/test/.local/lib/python3.6/site-packages/tensorflow/python/keras/engine/base_layer_utils.py", line 121, in <lambda>
    init_val = lambda: initializer(shape, dtype=dtype)
  File "/home/test/.local/lib/python3.6/site-packages/tensorflow/python/ops/init_ops_v2.py", line 548, in __call__
    scale /= max(1., (fan_in + fan_out) / 2.)
TypeError: unsupported operand type(s) for +: 'NoneType' and 'int'

1 Ответ

0 голосов
/ 05 марта 2020

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

conv_output_height = tf.shape(model.output)[1]
conv_output_width = model.output.shape[2]

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

РЕДАКТИРОВАТЬ: Вот окончательное решение:

conv_output_height = -1
conv_output_width = model.output.shape[2]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...