Как я могу применить tf.map_fn, используя несколько входов в Tensorflow - PullRequest
0 голосов
/ 19 июня 2019

Я пытаюсь получить поворотную точку, используя tf.map_fn для нескольких входов, используя Tensorflow в Pycharm.
Однако, когда я пытаюсь это сделать,
Я получаю сообщение об ошибке: TypeError: testzz () отсутствует 1 обязательный позиционный аргумент: 'data'

Как я могу решить эту проблему? Или как мне получить размер idxCut для использования цикла for?

Содержание разработки.

  • Найти индекс (idxCut), соответствующий порогу в данных.
  • Проверьте, являются ли данные, соответствующие idxCut, TPR.

Я хочу найти TPR (коэффициент поворота) о idxCut в данных, используя цикл for.
Я использовал цикл for для получения TPR между idx, idx-1 и idx + 1.
Я хочу найти данные [idx] выше, чем другие данные [idx-1, idx + 1].

    def testtt(data):
        ### Cut-off Threshold
        newData = data[5:num_input - 5]   # shape = [1, 100]
        idxCut = tf.where(newData > cutoff) + 5
        idxCut = tf.squeeze(idxCut)   
        # The size of idxCut is always variable. shape = [1, 10] or shape = [1, 27] or etc

        tq = tf.map_fn(testzz, (idxCut, data), dtype=tf.int32)
        print('tqqqq ', tq)
    def testzz(idxCut, data):
        v1 = tf.where(data[idxCut] > data[idxCut - 1], 1, 0)
        v2 = tf.where(data[idxCut] > data[idxCut + 1], 1, 0)
        return tf.where(v1 + v2 > 1, 1, 0)
Traceback (most recent call last):
  File "D:/PycharmProject/Test_DCGAN_BioSignal/test_xcorr_all.py", line 263, in <module>
    tprX = testtt(zX)
  File "D:/PycharmProject/Test_DCGAN_BioSignal/test_xcorr_all.py", line 149, in testtt
    tq = tf.map_fn(testzz, (idxCut, data), dtype=tf.int32)
  File "C:\Users\UserName\Anaconda3\envs\TSFW_pycharm\lib\site-packages\tensorflow\python\ops\functional_ops.py", line 494, in map_fn
    maximum_iterations=n)
  File "C:\Users\UserName\Anaconda3\envs\TSFW_pycharm\lib\site-packages\tensorflow\python\ops\control_flow_ops.py", line 3291, in while_loop
    return_same_structure)
  File "C:\Users\UserName\Anaconda3\envs\TSFW_pycharm\lib\site-packages\tensorflow\python\ops\control_flow_ops.py", line 3004, in BuildLoop
    pred, body, original_loop_vars, loop_vars, shape_invariants)
  File "C:\Users\UserName\Anaconda3\envs\TSFW_pycharm\lib\site-packages\tensorflow\python\ops\control_flow_ops.py", line 2939, in _BuildLoop
    body_result = body(*packed_vars_for_body)
  File "C:\Users\UserName\Anaconda3\envs\TSFW_pycharm\lib\site-packages\tensorflow\python\ops\control_flow_ops.py", line 3260, in <lambda>
    body = lambda i, lv: (i + 1, orig_body(*lv))
  File "C:\Users\UserName\Anaconda3\envs\TSFW_pycharm\lib\site-packages\tensorflow\python\ops\functional_ops.py", line 483, in compute
    packed_fn_values = fn(packed_values)

TypeError: testzz() missing 1 required positional argument: 'data'

1 Ответ

0 голосов
/ 19 июня 2019

Когда вы задаете несколько тензоров для tf.map_fn, их элементы передаются не как независимые аргументы данной функции, а как кортеж. Сделайте это:

def testzz(inputs):
    idxCut, data = inputs
    v1 = tf.where(data[idxCut] > data[idxCut - 1], 1, 0)
    v2 = tf.where(data[idxCut] > data[idxCut + 1], 1, 0)
    return tf.where(v1 + v2 > 1, 1, 0)
...