首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使learning_phase在TensorFlow 2中得到渴望?

如何使learning_phase在TensorFlow 2中得到渴望?
EN

Stack Overflow用户
提问于 2019-11-22 03:55:29
回答 1查看 1.4K关注 0票数 2

K.learning_phase()获取值,而不是张量本身。我需要学习阶段张量给K.function得到层梯度,输出等。工作良好的w/ import keras.backend as K,但失败的import tensorflow.keras.backend as K相关Git w/部分解决方案

我怎么才能得到张量本身呢?

可复制示例

代码语言:javascript
复制
import tensorflow.keras.backend as K
from tensorflow.keras.layers import Input, Dense
from tensorflow.keras.models import Model
import numpy as np

ipt = Input((16,))
out = Dense(16)(ipt)
model = Model(ipt, out)
model.compile('adam', 'mse')

x = np.random.randn(32, 16)
model.train_on_batch(x, x)

grads = model.optimizer.get_gradients(model.total_loss, model.layers[-1].output)
grads_fn = K.function(inputs=[model.inputs[0], model._feed_targets[0], K.learning_phase()], 
                      outputs=grads)

全误差跟踪

代码语言:javascript
复制
File "<ipython-input-2-7f74922d7492>", line 3, in <module>
  outputs=grads)
File "D:\Anaconda\envs\tf2_env\lib\site-packages\tensorflow_core\python\keras\backend.py", line 3773, in function
  return EagerExecutionFunction(inputs, outputs, updates=updates, name=name)
File "D:\Anaconda\envs\tf2_env\lib\site-packages\tensorflow_core\python\keras\backend.py", line 3670, in __init__
  base_graph=source_graph)
File "D:\Anaconda\envs\tf2_env\lib\site-packages\tensorflow_core\python\eager\lift_to_graph.py", line 249, in lift_to_graph
  visited_ops = set([x.op for x in sources])
File "D:\Anaconda\envs\tf2_env\lib\site-packages\tensorflow_core\python\eager\lift_to_graph.py", line 249, in <listcomp>
  visited_ops = set([x.op for x in sources])

AttributeError: 'int' object has no attribute 'op'
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-26 21:04:34

作为一种(不太好的)解决方法,您可以使用来自tensorflow.python.keras.backendtensorflow.python.keras.backend

代码语言:javascript
复制
from tensorflow.python.keras import backend

# ...
grads_fn = K.function(inputs=[model.inputs[0],
                              model._feed_targets[0],
                              backend.symbolic_learning_phase()], 
                      outputs=grads)

g_learning = grads_fn([x, x, True])
g_not_learning = grads_fn([x, x, False])

我不知道为什么这个函数不像learning_phase(),没有导出到tensorflow.keras.backend中。也许不这样做是有充分理由的。

此外,请注意,这里使用学习阶段只有当您的模型包含一些在训练和推理模式(例如辍学)中行为不同的层/操作时才有意义。否则,函数的输出将是相同的。

Updatebackend.symbolic_learning_phase()tensorflow.keras代码(示例)中使用,这表明不太反对公开使用它。它在急切执行中充当K.learning_phase()的插入替代器,用于K.function()

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58987264

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档