Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在tensorflow中每次迭代后添加_Tensorflow - Fatal编程技术网

如何在tensorflow中每次迭代后添加

如何在tensorflow中每次迭代后添加,tensorflow,Tensorflow,我正在努力实现以下目标: 计算前25次预测中的损失,并在预测前将其相加 计算梯度。我试过这个: loss_summation=tf.Variable(0,dtype=tf.dtypes.float32,name="loss") xentropy=tf.nn.sparse_softmax_cross_entropy_with_logits(labels=next_element[1],logits=logits2,name="xentropy") loss=tf.math.reduce_sum(t

我正在努力实现以下目标:

计算前25次预测中的损失,并在预测前将其相加 计算梯度。我试过这个:

loss_summation=tf.Variable(0,dtype=tf.dtypes.float32,name="loss")
xentropy=tf.nn.sparse_softmax_cross_entropy_with_logits(labels=next_element[1],logits=logits2,name="xentropy")
loss=tf.math.reduce_sum(tf.reduce_mean(xentropy,name="loss"))
loss_summation=tf.assign(loss_summation,loss_summation+loss)
optimizer = tf.train.AdamOptimizer(learning_rate=self.learning_rate)
 gvs = optimizer.compute_gradients(loss_summation,[vars])
with tf.Session() as sess():
      for i in range(25):
                     b=sess.run([loss_summation])
然而,
optimizer.compute_gradients()
抱怨
无不支持的值
。你怎么能绕过这个

实际上,我正试图在tensorflow中实现以下函数(LSTM的前馈),以预测前面给定的下一个单词

def feedforward(self,x_s,hpre,targets,p_s):


    fts,its,gts,css,ots,output,inputs=[],[],[],[],[],[],[]
        losses=[]
        hprev=hpre
        hts=[hprev]
        loss=0
        losses=[]
        previous_state=p_s
        css.append(previous_state)
        for x,y in zip(x_s,targets):
            k=np.zeros((self.vocab_size,1))
            k[x]=1 
            M_c=np.row_stack((hprev,k))                      
            ft=self.sigmoid(np.dot(self.W1,M_c)+self.b1)
            fts.append(ft)
            it=self.sigmoid(np.dot(self.W2,M_c)+self.b2)
            its.append(it)
            gt=np.tanh(np.dot(self.W3,M_c)+self.b3)
            gts.append(gt)
            cs=(ft*previous_state)+(it*gt)
            previous_state=cs
            css.append(cs)
            ot=self.sigmoid(np.dot(self.W4,M_c)+self.b4)
            ots.append(ot)
            ht=ot*np.tanh(cs)
            hts.append(ht)
            yt=self.softmax(np.dot(self.W5,ht)+self.b5)
            hprev=ht
            output.append(yt)
            inputs.append(M_c)
            loss+=-np.log(yt[y])
            losses.append(loss)

        return fts,its,gts,css,ots,output,hts,loss,hts[-1],css[-1],inputs
x_s
是表示单词的整数列表

x_s=[0,1,2,3,4,5,6,7,8....,24]
targets是期望的整数列表,即如果x_s=0,则下一个字母为1

targets=[1,2,3,4,5,6,7,8,9...,25]

损失是25个损失的总和,可以将损失降至最低。

这里有几件事需要解决:

  • 是否有充分的理由不使用更大的批次?您是否正在尝试实施或什么

  • 你看起来像是刚开始使用TensorFlow。考虑使用“代码> TF.Enable AgErrEyExalpon())/<代码>启动热切执行。TensorFlow 2.0即将推出,不要浪费时间在
    tf.Sessions

  • 变量是不可微的。因此,将损失累积在一个变量中没有任何意义

  • 我将复制所有模型变量,并在那里累积新值。然后,在
    N
    迭代之后,将这些值分配回模型。比如:


  • 请尝试构造一个最小的自包含示例,以便我们可以复制它(例如,
    next\u元素
    logits2
    vars
    未在您的代码中定义)。你能更详细地解释一下你到底想要什么吗?你想要最后25批的总损失吗?还是个别例子?那么,你想在这25次损失评估期间也进行培训,还是只有在你得到这些评估的总和之后才进行培训?也许多给一点你想用它实现的内容的上下文会更容易理解。@jdehesa,我添加了更多的上下文,希望更清楚。你没有使用(因为你正在使用会话),所以你不能用
    for
    循环迭代张量。在任何情况下,您都必须在创建任何会话之前,在不使用其他变量的情况下,将张量对象(例如,使用a)中的损失进行聚合。但是TensorFlow已经有效地实现了,您有什么理由不使用标准API吗?谢谢。我只是想在使用现有的API之前了解它背后的科学知识。我明白了,这是一个很好的理由(几乎是唯一的理由)。TensorFlow中有关于RNN的内容,您可能会发现这些内容很有用。第一篇文章展示了如何“手工”构建RNN。它使用
    tf.unpack
    ,这样你就可以在张量切片列表中迭代,而不必使用
    tf.while\u loop
    (这是等效的,但更复杂)。接下来的帖子可能也很有趣。
    model = tf.keras.Sequential(...)
    vars = model.trainable_variables
    weight_acc = [tf.Variable(var) for var in model.trainable_variables]
    for n,(batch, label) in enumerate(dataset):
      with tf.GradientTape() as tape:
        pred = model(batch)
        loss = cal_loss(batch, label)
      grads = tape.gradients(loss, vars)
      for g, a in zip(grad, weight_acc):
        a.assign_add(learning_rate*g)
      if n%25 == 0:
        for a, v in zip(weight_acc, vars):
          v.assign_add(lookahead_fraction*(a-v))