使用tf.gather选择顶部值样本用于线性模型结果时出现’没有为任何变量提供梯度’错误

我想在训练中执行以下步骤:

  1. 创建一个线性张量:目标=权重 * X

  2. 选择顶部目标值并丢弃所有其他样本。

  3. 获取对应的标签,即Y。

  4. 使用梯度下降优化器,最小化sum(Y)并获取拟合变量(W)

代码

from tensorflow.python.framework import opsimport numpy as npimport tensorflow as tfsess = tf.Session()X=tf.placeholder(shape=[None,2], dtype=tf.float32)Y=tf.placeholder(shape=[None,1], dtype=tf.float32)W = tf.Variable(tf.random_normal(shape=[2, 1]), dtype=tf.float32)target=tf.matmul(X, W)flattened=tf.reshape(target,[-1])selected_targets, keys=tf.nn.top_k(flattened, k=100)#get corresponding Yselected_y = tf.gather(Y, keys)#now we have top 100 selected_targets, and selected_y, train and evaluate W, and fit minimal sum(Y)train_target = tf.reduce_sum(selected_y) #But if use selected_targets instead of selected_y, it would run successfully, why?optimizer = tf.train.GradientDescentOptimizer(1)train = optimizer.minimize(train_target)# trainingx_vals = np.random.rand(1000,2)y_vals = np.random.rand(1000,1)sess.run(tf.global_variables_initializer())sess.run(tf.local_variables_initializer())sess.run(train, {X: x_vals, Y:y_vals})print(sess.run([W]))

我遇到了这个错误:

ValueError: 没有为任何变量提供梯度,请检查您的图形中是否有不支持梯度的操作,变量[“”]和损失Tensor(“Sum:0”, shape=(), dtype=float32)之间。

有人能帮助解决这个问题吗?我发现当在张量上应用tf.nn.top_k时会发生这种情况。但为什么呢?


回答:

它之所以这么说,是因为没有梯度。你创建的图形是不可微分的,因为keys是唯一连接损失和W变量的东西,而keys是不可微分的整数。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注