условное присвоение keras (тензор потока) с помощью K.switch () - PullRequest
0 голосов
/ 17 октября 2018

Я пытаюсь реализовать что-то вроде

if np.max(subgrid) == np.min(subgrid):
    middle_middle = cur_subgrid + 1
else:
    middle_middle = cur_subgrid

Поскольку условие может быть определено только во время выполнения, я использую синтаксис keras следующим образом:

middle_middle = K.switch(K.max(subgrid) == K.min(subgrid), lambda: tf.add(cur_subgrid,1), lambda: cur_subgrid)

НоЯ получаю эту ошибку:

в col_loop (j, gray_map, mask_A) 56 57 ---> 58 middle_middle = K.switch (K.max (subgrid) == K.min (подсетка), лямбда: tf.add (cur_subgrid, 1), лямбда: cur_subgrid) 59 60 print ('ml', middle_left.shape)

/ nfs / isicvlnas01 / share / anaconda3 / lib / python3.5/site-packages/keras/backend/tensorflow_backend.py в switch (условие, затем выражение, еще выражение) 2561
Выбранный тензор.2562 "" "-> 2563 если условие.dtype! = Tf.bool: 2564 условие = tf.cast (условие, 'bool') 2565, если не вызывается (then_expression):

AttributeError: объект 'bool'не имеет атрибута 'dtype'

middle_middle, cur_subgrid и subgrid являются тензорами NxN. Любая помощь приветствуется.

1 Ответ

0 голосов
/ 17 октября 2018

Я думаю, что проблема в том, что с K.max(subgrid) == K.min(subgrid) вы создаете python логическое , сравнивающее два тензорных объекта, а не тензор потока булева , содержащее значение сравнения значения двух входных тензоров.

Другими словами, то, что вы написали, будет оцениваться как

K.switch(True, lambda: tf.add(cur_subgrid,1), lambda: cur_subgrid)

вместо

comparison = ... # Some tensor, that at runtime will contain True if min and max are the same, False otherwise. 
K.switch(comparison , lambda: tf.add(cur_subgrid,1), lambda: cur_subgrid)

Так что вам нужно использовать keras.backend.equal () вместо ==:

K.switch(K.equal(K.max(subgrid),K.min(subgrid)), lambda: tf.add(cur_subgrid,1), lambda: cur_subgrid)
...