Python 如何使用tf.where和卷积?

Python 如何使用tf.where和卷积?,python,tensorflow,Python,Tensorflow,我想创建一个图,根据分类结果在某个点后拆分成其他几个图。我认为tf.cond或tf.where可能正确使用,但我不确定如何使用 这里不可能复制我所有的代码,但我创建了一个小片段来说明这个问题 import os import sys import tensorflow as tf GPU_INDEX = 2 net_class = tf.constant([[0.1, 0.2, 0.3, 0.4], [0.4, 0.3, 0.2, 0.1],[0.2, 0.4, 0.3, 0.1], [0.3

我想创建一个图,根据分类结果在某个点后拆分成其他几个图。我认为tf.cond或tf.where可能正确使用,但我不确定如何使用

这里不可能复制我所有的代码,但我创建了一个小片段来说明这个问题

import os
import sys
import tensorflow as tf
GPU_INDEX = 2

net_class = tf.constant([[0.1, 0.2, 0.3, 0.4], [0.4, 0.3, 0.2, 0.1],[0.2, 0.4, 0.3, 0.1], [0.3, 0.2, 0.4, 0.1],[0.1, 0.3, 0.3, 0.4]]) # 3,0,1,2,3
classes = tf.argmax(net_class, axis=1)
cls_0_idx = tf.squeeze(tf.where(tf.equal(classes, 0)))
cls_3_idx = tf.squeeze(tf.where(tf.equal(classes, 3)))

cls_0 = tf.gather(params=net_class, indices=cls_0_idx)
cls_3 = tf.gather(params=net_class, indices=cls_3_idx)

params_0 = tf.constant([1.0,1,1,1])
params_3 = tf.constant([3.0,3,3,3])


output = tf.stack([tf.nn.conv1d(cls_0, params_0, 1,  padding='VALID'), tf.nn.conv1d(cls_3, params_3, 1,  padding='VALID')])

sess = tf.Session()
cls_0_idx_val = sess.run(output)

print(output)
在这里,我试图提取分类为0或3的输入的索引,并使用不同的变量将它们相乘,以获得每个类的输出共享权重,这就是我使用卷积的原因

我得到以下错误:

ValueError: Shape must be rank 4 but is rank 2 for 'conv1d/Conv2D' (op: 'Conv2D') with input shapes: ?, [1,4].
我理解为什么会出现错误,因为tf.where不知道它的大小,但问题是如何修复它?在我的实际问题中,这些类并不相等,甚至可能是空的

我想你应该这样做

将轴设置为1英寸tf

将tf.nn.conv1d更改为简单乘法

将tf.stack更改为tf.concat

然后你会有这样的东西:

net_class = tf.constant([[0.1, 0.2, 0.3, 0.4], [0.4, 0.3, 0.2, 0.1],[0.2, 0.4, 0.3, 0.1], [0.3, 0.2, 0.4, 0.1],[0.1, 0.3, 0.3, 0.4]]) # 3,0,1,2,3
classes = tf.argmax(net_class, axis=1)
cls_0_idx = tf.squeeze(tf.where(tf.equal(classes, 0)), -1)
cls_3_idx = tf.squeeze(tf.where(tf.equal(classes, 3)), -1)

cls_0 = tf.gather(params=net_class, indices=cls_0_idx)
cls_3 = tf.gather(params=net_class, indices=cls_3_idx)

params_0 = tf.constant([1.0,1,1,1])
params_3 = tf.constant([3.0,3,3,3])
output = tf.concat([cls_0 * params_0, cls_3 * params_3], axis = 0)

对这管用!但我刚刚意识到我需要保持原始阵列网络在输出中的顺序,现在它只是将它们堆叠起来。我怎么能做到呢?我想出来了:output=tf.Variabletf.zeros\u liket\u class output=tf.scatter\u ndu addoutput,index=tf.expand\u dimscls\u 0\u idx,-1,updates=cls\u 0*params\u 0 output=tf.scatter\u ndu addoutput,index=tf.expand\u dimscls\u 3\u idx,axis=-1,updates=cls\u 3*params\u 3Sorry对于许多注释,tf.scatter\u ndu add不在这里。它没有正确地更新模型,tf.scatter\u update没有梯度,因此我仍然在研究如何重新排序数据以匹配原始数据,并使梯度正确