如何在tensorflow中每次迭代后添加
我正在努力实现以下目标: 计算前25次预测中的损失,并在预测前将其相加 计算梯度。我试过这个:如何在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
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个损失的总和,可以将损失降至最低。这里有几件事需要解决:
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))