- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
仅供引用,我正在尝试使用 Tensorflow 实现梯度下降算法。
我有一个矩阵X
[ x1 x2 x3 x4 ]
[ x5 x6 x7 x8 ]
我乘以一些特征向量 Y
得到 Z
[ y1 ]
Z = X [ y2 ] = [ z1 ]
[ y3 ] [ z2 ]
[ y4 ]
然后我将 Z 通过 softmax 函数,并取对数。我将输出矩阵称为 W。
所有这些都是按如下方式实现的(添加了一点样板,因此它可以运行)
sess = tf.Session()
num_features = 4
num_actions = 2
policy_matrix = tf.get_variable("params", (num_actions, num_features))
state_ph = tf.placeholder("float", (num_features, 1))
action_linear = tf.matmul(params, state_ph)
action_probs = tf.nn.softmax(action_linear, axis=0)
action_problogs = tf.log(action_probs)
W(对应于action_problogs
)看起来像
[ w1 ]
[ w2 ]
我想找到 w1
相对于矩阵 X
的梯度 - 也就是说,我想计算
[ d/dx1 w1 ]
d/dX w1 = .
.
[ d/dx8 w1 ]
(最好仍然看起来像一个矩阵,这样我可以将它添加到 X
,但我真的不关心那个)
我希望 tf.gradients
可以解决问题。我这样计算“梯度”
problog_gradient = tf.gradients(action_problogs, policy_matrix)
但是,当我检查 problog_gradient
时,这是我得到的结果
[<tf.Tensor 'foo_4/gradients/foo_4/MatMul_grad/MatMul:0' shape=(2, 4) dtype=float32>]
请注意,这与 X
具有完全相同的形状,但实际上不应该。我希望得到一个包含两个梯度的列表,每个梯度对应 8 个元素。我怀疑我得到的是两个梯度,但每个梯度都与四个元素有关。
我是 tensorflow 的新手,所以我很感激并解释正在发生的事情以及我如何实现我想要的行为。
最佳答案
梯度需要一个标量函数,因此默认情况下,它对条目求和。这是默认行为,因为所有梯度下降算法都需要这种类型的功能,而随机梯度下降(或其变体)是 Tensorflow 内部的首选方法。您不会找到任何更高级的算法(如 BFGS 或其他算法),因为它们根本尚未实现(并且它们需要真正的雅可比行列式,但也尚未实现)。就其值(value)而言,这是我编写的一个有效的 Jacobian 实现:
def map(f, x, dtype=None, parallel_iterations=10):
'''
Apply f to each of the elements in x using the specified number of parallel iterations.
Important points:
1. By "elements in x", we mean that we will be applying f to x[0],...x[tf.shape(x)[0]-1].
2. The output size of f(x[i]) can be arbitrary. However, if the dtype of that output
is different than the dtype of x, then you need to specify that as an additional argument.
'''
if dtype is None:
dtype = x.dtype
n = tf.shape(x)[0]
loop_vars = [
tf.constant(0, n.dtype),
tf.TensorArray(dtype, size=n),
]
_, fx = tf.while_loop(
lambda j, _: j < n,
lambda j, result: (j + 1, result.write(j, f(x[j]))),
loop_vars,
parallel_iterations=parallel_iterations
)
return fx.stack()
def jacobian(fx, x, parallel_iterations=10):
'''
Given a tensor fx, which is a function of x, vectorize fx (via tf.reshape(fx, [-1])),
and then compute the jacobian of each entry of fx with respect to x.
Specifically, if x has shape (m,n,...,p), and fx has L entries (tf.size(fx)=L), then
the output will be (L,m,n,...,p), where output[i] will be (m,n,...,p), with each entry denoting the
gradient of output[i] wrt the corresponding element of x.
'''
return map(lambda fxi: tf.gradients(fxi, x)[0],
tf.reshape(fx, [-1]),
dtype=x.dtype,
parallel_iterations=parallel_iterations)
虽然此实现有效,但当您尝试嵌套它时它不起作用。例如,如果您尝试使用 jacobian( jacobian( ... ))
计算 Hessian,则会出现一些奇怪的错误。这被跟踪为 Issue 675 .我还是awaiting a response为什么这会引发错误。我相信 while 循环实现或梯度实现中存在一个根深蒂固的错误,但我真的不知道。
无论如何,如果您只需要一个 jacobian,请尝试上面的代码。
关于python - 关于矩阵的 tensorflow 梯度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48878053/
我想将模型及其各自训练的权重从 tensorflow.js 转换为标准 tensorflow,但无法弄清楚如何做到这一点,tensorflow.js 的文档对此没有任何说明 我有一个 manifest
我有一个运行良好的 TF 模型,它是用 Python 和 TFlearn 构建的。有没有办法在另一个系统上运行这个模型而不安装 Tensorflow?它已经经过预训练,所以我只需要通过它运行数据。 我
当执行 tensorflow_model_server 二进制文件时,它需要一个模型名称命令行参数,model_name。 如何在训练期间指定模型名称,以便在运行 tensorflow_model_s
我一直在 R 中使用标准包进行生存分析。我知道如何在 TensorFlow 中处理分类问题,例如逻辑回归,但我很难将其映射到生存分析问题。在某种程度上,您有两个输出向量而不是一个输出向量(time_t
Torch7 has a library for generating Gaussian Kernels在一个固定的支持。 Tensorflow 中有什么可比的吗?我看到 these distribu
在Keras中我们可以简单的添加回调,如下所示: self.model.fit(X_train,y_train,callbacks=[Custom_callback]) 回调在doc中定义,但我找不到
我正在寻找一种在 tensorflow 中有条件打印节点的方法,使用下面的示例代码行,其中每 10 个循环计数,它应该在控制台中打印一些东西。但这对我不起作用。谁能建议? 谢谢,哈米德雷萨, epsi
我想使用 tensorflow object detection API 创建我自己的 .tfrecord 文件,并将它们用于训练。该记录将是原始数据集的子集,因此模型将仅检测特定类别。我不明白也无法
我在 TensorFlow 中训练了一个聊天机器人,想保存模型以便使用 TensorFlow.js 将其部署到 Web。我有以下内容 checkpoint = "./chatbot_weights.c
我最近开始学习 Tensorflow,特别是我想使用卷积神经网络进行图像分类。我一直在看官方仓库中的android demo,特别是这个例子:https://github.com/tensorflow
我目前正在研究单图像超分辨率,并且我设法卡住了现有的检查点文件并将其转换为 tensorflow lite。但是,使用 .tflite 文件执行推理时,对一张图像进行上采样所需的时间至少是使用 .ck
我注意到 tensorflow 的 api 中已经有批量标准化函数。我不明白的一件事是如何更改训练和测试之间的程序? 批量归一化在测试和训练期间的作用不同。具体来说,在训练期间使用固定的均值和方差。
我创建了一个模型,该模型将 Mobilenet V2 应用于 Google colab 中的卷积基础层。然后我使用这个命令转换它: path_to_h5 = working_dir + '/Tenso
代码取自:- http://adventuresinmachinelearning.com/python-tensorflow-tutorial/ import tensorflow as tf fr
好了,所以我准备在Tensorflow中运行 tf.nn.softmax_cross_entropy_with_logits() 函数。 据我了解,“logit”应该是概率的张量,每个对应于某个像素的
tensorflow 服务构建依赖于大型 tensorflow ;但我已经成功构建了 tensorflow。所以我想用它。我做这些事情:我更改了 tensorflow 服务 WORKSPACE(org
Tensoflow 嵌入层 ( https://www.tensorflow.org/api_docs/python/tf/keras/layers/Embedding ) 易于使用, 并且有大量的文
我正在尝试使用非常大的数据集(比我的内存大得多)训练 Tensorflow 模型。 为了充分利用所有可用的训练数据,我正在考虑将它们分成几个小的“分片”,并一次在一个分片上进行训练。 经过一番研究,我
根据 Sutton 的书 - Reinforcement Learning: An Introduction,网络权重的更新方程为: 其中 et 是资格轨迹。 这类似于带有额外 et 的梯度下降更新。
如何根据条件选择执行图表的一部分? 我的网络有一部分只有在 feed_dict 中提供占位符值时才会执行.如果未提供该值,则采用备用路径。我该如何使用 tensorflow 来实现它? 以下是我的代码
我是一名优秀的程序员,十分优秀!