掩模张量流输入数据

时间:2017-05-29 23:16:19

标签: tensorflow

我想在tensorflow中为每个输入要素应用遮罩。如果蒙版是固定的,这很容易做到 - 只需在图形中定义并应用它。问题是,我希望在训练期间改变面具 - 每个训练步骤都会略有不同。事实上,对于每一步,我都有一个函数返回一个numpy数组,表示每一步的掩码。

经过多次试验和错误搜索后,我发现没有办法应用这个掩码 - 据我所知,这是不可能的,由tensorflow的属性强制修复计算的所有属性时图是建立的。

但是,我对tensorflow很新,所以很可能这是可行的,甚至很容易。任何人都可以帮助我吗?

伪代码将是:

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context=".UserActivity"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/colorWhite">

    <android.support.design.widget.AppBarLayout android:id="@+id/activity_user_appbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/AppTheme.AppBarOverlay">

        <android.support.design.widget.CollapsingToolbarLayout android:id="@+id/activity_user_collapsingtoolbar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:fitsSystemWindows="true"
            app:contentScrim="?attr/colorPrimary"
            app:layout_scrollFlags="scroll|exitUntilCollapsed">

            <android.support.v7.widget.Toolbar android:id="@+id/activity_user_toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                app:contentInsetLeft="0dp"
                app:contentInsetStart="0dp"
                app:popupTheme="@style/AppTheme.PopupOverlay"
                app:layout_collapseMode="pin">

                <!-- toolbar content -->

            </android.support.v7.widget.Toolbar>

        </android.support.design.widget.CollapsingToolbarLayout>

    </android.support.design.widget.AppBarLayout>

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_behavior="@string/appbar_scrolling_view_behavior">

        <LinearLayout android:id="@+id/activity_user_eventsalert"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:gravity="center"
            android:orientation="vertical">

            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:src="@drawable/calendar_remove_titlegray_48px"/>

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="20dp"
                android:text="No events yet"
                android:textSize="20sp"
                android:textColor="@color/colorTitleGray"/>
        </LinearLayout>

    </RelativeLayout>

    <View
        android:layout_width="match_parent"
        android:layout_height="10dp"
        android:layout_gravity="bottom"
        android:background="@drawable/shadow_bottom_white_to_transparent"/>

</android.support.design.widget.CoordinatorLayout>

星星是我不知道该怎么做的地方。

2 个答案:

答案 0 :(得分:2)

这似乎很容易,只是numpy。事实上,我有一种情况,我想做一些对我来说似乎微不足道但在张量流中很难的事情。具体来说,我想基于这些元素的值将数学函数应用于张量的某些元素。 EG:

array_a[array_a > 0] = np.log(array_a + 1)[array_a > 0]

其转换为“A大于零的A等于A的对数加上A大于零的一个”。

我在tensorflow中没有成功,直到我发现 tf.py_func 。根据{{​​3}}的py_func描述,

  

“给定一个python函数func,它将numpy数组作为输入并返回numpy数组作为其输出,将此函数包装为TensorFlow图形中的操作。”

因此,要将此应用于您的情况,您可以执行类似

的操作
def tf_mask(the_tensor,the_mask):
    def np_mask(a,b):
        return a[b]
    return tf.py_func(np_mask, [the_tensor,the_mask], tf.float32)

或者如果您想保留数组的形状,请执行类似

的操作
def tf_mask(the_tensor,the_mask):
    def np_mask(a,b):
        a[b == 0] = 0
        return a
    return tf.py_func(np_mask, [the_tensor,the_mask], tf.float32)

总之,找到一种在numpy中执行此操作的方法,然后使用py_func。 Numpy非常强大,我们可以在Tensorflow中显然发挥这种力量。

答案 1 :(得分:0)

您需要将屏蔽操作逻辑添加为TensorFlow graph的一部分。具体来说,control flow operators tf.logical_and tf.logical_or tf.case 可让您有条件地选择所需的数据该模型正在运行。

例如,下面的代码显示了如何根据两个训练数据或标签输入的状态构建一个4元素张量。您应该能够对您的情况应用类似的逻辑。

def const_v(val):
    return tf.constant(val, tf.float32)

def const_1():
    return const_v(1)

def const_0():
    return const_v(0)

def cond_and(cond_1, cond_2, val_1, val_2):
    return tf.logical_and(tf.equal(cond_1, val_1),
                          tf.equal(cond_2, val_2))

def vec4(c1, c2, c3, c4):
    return [const_v(c1), const_v(c2), const_v(c3), const_v(c4)]

# c1 c2 vector
# 1 1 [1, 0 , 0 ,0]
# 1 0 [0, 1, 0, 0]
# 0 1 [0, 0, 1, 0]
# 0 0 [0, 0, 0, 1]

def combined_conditions(cond_1, cond_2):
    return tf.stack(tf.case({cond_and(cond_1, cond_2, const_1(), const_1()): lambda: vec4(1, 0, 0, 0),
                    cond_and(cond_1, cond_2, const_1(), const_0()): lambda: vec4(0, 1, 0, 0),
                    cond_and(cond_1, cond_2, const_0(), const_1()): lambda: vec4(0, 0, 1, 0),
                    cond_and(cond_1, cond_2, const_0(), const_0()): lambda: vec4(0, 0, 0, 1)
                    }, default=lambda: vec4(0, 0, 0, 0), exclusive=True))