使用 K.switch() 进行 keras(张量流后端)条件分配 [英] keras (tensorflow backend) conditional assignment with K.switch()

查看:23
本文介绍了使用 K.switch() 进行 keras(张量流后端)条件分配的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试实现类似

如果 np.max(subgrid) == np.min(subgrid):middle_middle = cur_subgrid + 1别的:middle_middle = cur_subgrid

由于条件只能在运行时确定,我使用 Keras 语法如下

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

但是我收到了这个错误:

<ipython-input-112-0504ce070e71>在 col_loop(j, gray_map, mask_A)5657--->58 middle_middle = K.switch(K.max(subgrid) == K.min(subgrid), lambda: tf.add(cur_subgrid,1), lambda: cur_subgrid)5960 打印 ('ml',middle_left.shape)/nfs/isicvlnas01/share/anaconda3/lib/python3.5/site-packages/keras/backend/tensorflow_backend.py in switch(condition, then_expression, else_expression) 2561 选择的张量.第2562章->2563 if condition.dtype != tf.bool: 2564 condition = tf.cast(condition, 'bool') 2565 if not callable(then_expression):AttributeError:布尔"对象没有属性dtype"

middle_middlecur_subgrid、subgrid都是NxN张量.任何帮助表示赞赏.

解决方案

我认为问题在于使用 K.max(subgrid) == K.min(subgrid) 你正在创建一个python boolean 比较两个张量对象,而不是 tensorflow 布尔张量,其中包含两个输入张量的 values 的比较值.p>

也就是说,你写的东西会被评价为

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

而不是

comparison = ... # 一些张量,如果 min 和 max 相同,则在运行时将包含 True,否则为 False.K.switch(比较,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)

I'm trying to implement something like

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

Since the condition can only be determined at run-time, I'm using Keras syntax as following

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

But I'm getting this error:

<ipython-input-112-0504ce070e71> in col_loop(j, gray_map, mask_A)
     56 
     57 
---> 58             middle_middle = K.switch(K.max(subgrid) == K.min(subgrid), lambda: tf.add(cur_subgrid,1), lambda: cur_subgrid)
     59 
     60             print ('ml',middle_left.shape)

/nfs/isicvlnas01/share/anaconda3/lib/python3.5/site-packages/keras/backend/tensorflow_backend.py in switch(condition, then_expression, else_expression)    2561         The selected tensor.    2562     """
-> 2563     if condition.dtype != tf.bool:    2564         condition = tf.cast(condition, 'bool')    2565     if not callable(then_expression):

AttributeError: 'bool' object has no attribute 'dtype'

middle_middle, cur_subgrid, and subgrid are all NxN tensors. Any help is appreciated.

解决方案

I think the problem is that with K.max(subgrid) == K.min(subgrid) you're creating a python boolean comparing two tensor objects, not a tensorflow boolean tensor containing the value of the comparison of the values of the two input tensors.

In other words, what you have written will be evaluated as

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

instead of

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)

So what you need to do is to use keras.backend.equal() instead of ==:

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

这篇关于使用 K.switch() 进行 keras(张量流后端)条件分配的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆