Python 在Tensorflow中初始化批处理因变量

Python 在Tensorflow中初始化批处理因变量,python,tensorflow,Python,Tensorflow,我有一个tensorflow代码,运行良好且准确,但占用大量内存。具体地说,在我的代码中,我有一个for循环,看起来像这样: K = 10 myarray1 = tf.placeholder(tf.float32, shape=[None,5,5]) # shape = [None, 5, 5] myarray2 = tf.Variable( np.zeros([K,5,5]), dtype=tf.float32 ) vals = [] for k in range(0,K): tmp

我有一个tensorflow代码,运行良好且准确,但占用大量内存。具体地说,在我的代码中,我有一个for循环,看起来像这样:

K = 10
myarray1 = tf.placeholder(tf.float32, shape=[None,5,5]) # shape = [None, 5, 5]
myarray2 = tf.Variable( np.zeros([K,5,5]), dtype=tf.float32 )
vals = []
for k in range(0,K):
    tmp = tf.reduce_sum(myarray1*myarray2[k],axis=(1,2))
    vals.append(tmp)

result = tf.min( tf.stack(vals,axis=-1), axis=-1 )
不幸的是,随着K在我的应用程序中变得越来越大,这需要大量内存。所以,我想有一个更好的方法。例如,在numpy/python中,在循环中迭代时只需跟踪最小值,并在每次迭代时更新它。似乎我可以使用tf.assign,如下所示:

K = 10
myarray1 = tf.placeholder(tf.float32, shape=[None,5,5]) # shape = [None, 5, 5]
myarray2 = tf.Variable( np.zeros([K,5,5]), dtype=tf.float32 )
min_value = tf.Variable(myarray1, validate_shape=False, trainable=False)
for k in range(0,K):
    tmp = myarray1*myarray2[k]
    idx = tf.where(tmp<min_value)
    tf.scatter_nd_assign(min_value, idx, tmp[idx], use_locking=True)

result = min_value

它抱怨我没有在占位符中进食。这实际上是有意义的,因为min_值的定义取决于图中的myarray1

我实际上想做的是定义一个伪变量,它不依赖于myarray1的值,而是匹配它的形状。我希望将这些值初始化为某个数字(在本例中,可以使用较大的数字),因为我将手动确保这些值在网络中被覆盖

注:据我所知,目前无法定义形状未知的变量,除非输入所需形状的另一个变量并设置validate_shape=False)。也许还有别的办法


欢迎提供任何帮助/建议。

试试这个,如果不知道如何输入占位符,请阅读教程

K = 10
myarray1 = tf.placeholder(tf.float32, shape=[None,5,5]) # shape = [None, 5, 5]

###################ADD THIS ####################
sess=tf.Session()
FOO = tf.run(myarray1,feed_dict={myarray1: YOURDATA}) #get myarray1 value
#replace all myarray1 below with FOO
################################################

myarray2 = tf.Variable( np.zeros([K,5,5]), dtype=tf.float32 )
min_value = tf.Variable(FOO, validate_shape=False, trainable=False)
for k in range(0,K):
    tmp = FOO*myarray2[k]
    idx = tf.where(tmp<min_value)
    tf.scatter_nd_assign(min_value, idx, tmp[idx], use_locking=True)

result = min_value
步骤2:获取批量数据

batch_x=[[1,2],[3,4]]   #example
#since x=[None,2], the batch size would be batch_x_size/x_size=2 
步骤3:进行一次会话

sess=tf.Session()

如果有变量,请在计算前添加以下代码进行初始化

init=tf.gobal_variables_initializer()
sess.run(init)

步骤4:

yourplaceholderdictiornay={x: batch_x}
sess.run(x, feed_dict=yourplaceholderdictiornay)
始终输入占位符,使其获得要计算的值


这里有一个非常有用的PDF文件,您也可以在youtube上找到它,标题为。

我不确定您是否仔细阅读了我的问题。问题在于,在知道myarray1的形状之前,无法初始化min_值变量。因此,“批次相关”变量。myarray1可以在每次网络运行时更改,所以没有办法硬编码。哈哈。我感谢你的帮助。不幸的是,我认为这并不能回答问题。我当然可以硬编码min_值的值和形状。但是,如果我想在运行时更改批大小,那么这不是很有用。我想我的问题是,是否有更好的方法,因为我在网上找不到其他任何东西。
sess=tf.Session()
init=tf.gobal_variables_initializer()
sess.run(init)
yourplaceholderdictiornay={x: batch_x}
sess.run(x, feed_dict=yourplaceholderdictiornay)