Tensor.name在急于执行MSE函数时是没有意义的



我正在Tensorflow 2.0中进行一些练习,以确保正确理解基础知识。我目前的任务是使用keras优化器来拟合具有MSE函数的回归。然而,当我尝试运行下面的代码时,我会收到下面的错误:

AttributeError:Tensor.name在启用紧急执行时没有意义。你可以直接在下面找到代码:

import pandas as pd
import numpy as np
import tensorflow as tf
from sklearn.model_selection import train_test_split
data = pd.read_csv( 'cars.csv' )
continuous_features = data[ [ "Identification.Year","Engine Information.Engine Statistics.Horsepower","Engine Information.Engine Statistics.Torque"] ].values / 100 
X = np.concatenate( [ continuous_features ] , axis=1 )
X = np.append(np.ones((X.shape[0],1) ) , X, axis=1)
Y = data[ [ 'Fuel Information.City mpg' ] ].values
# Perform basic subset selection in the code:
train_features , test_features ,train_labels, test_labels = train_test_split( X , Y , test_size=0.2 )
# Training data.
X = tf.Variable( train_features , dtype=tf.float32 )
Y = tf.Variable( train_labels , dtype=tf.float32 )                                                         
# Testing data
test_X = tf.Variable( test_features , dtype=tf.float32 ) 
test_Y = tf.Variable( test_labels , dtype=tf.float32 ) 
num_features = X.shape[1]
# Define the coefficientst that we'll be starting with:
weights = tf.Variable(tf.random.normal((num_features,1)))
def MSE(y_val ,x_val,weights):
output = tf.Variable(tf.tensordot(X, weights, axes=1 ),name = "output"   )
mse_val =  tf.reduce_mean( tf.square( output - y_val ) )
return(mse_val)
mse_opt = tf.keras.optimizers.SGD(learning_rate = 1e-7,momentum = .9)
weight_vals = weights
def temp_mse(weight_vals):
return(MSE(Y,X,weight_vals))
func_for_opt = lambda: tf.abs(temp_mse(weight_vals))
mse_opt.minimize(func_for_opt, [weight_vals]).numpy()

我已经能够将这种框架用于其他一些更简单的数值实验问题,但这似乎有问题。有人能就如何解决这个问题提出建议吗?

  • Python版本:3.8.5
  • numpy版本:1.18.5
  • pandas版本:1.1.3
  • TensorFlow版本:2.3.1

编辑:我删除了name=";输出";值,并得到以下错误:

ValueError:没有为任何变量提供梯度:[‘变量:0’]。

我检查了实现中是否有任何东西可以阻止它被区分,但现在我没有看到任何超过tf.abs调用的东西(已删除;问题仍然存在(。

您可以按照错误指示执行操作。删除名称

output = tf.Variable(tf.tensordot(X, weights, axes=1 ),name = "output"   )

将其更改为

output = tf.Variable(tf.tensordot(X, weights, axes=1 )  )

而且你实际上并没有在任何地方引用它,所以为什么要麻烦命名它呢?

*******************更新*****************

我没有时间运行你的代码,但你现在遇到的错误是,在损失函数和变量之间没有路径。

这条线路是错误的

output = tf.Variable(tf.tensordot(X, weights, axes=1 ),name = "output"   )

为什么要在mse函数中创建一个变量?你应该有

output = tf.tensordot(X, weights, axes=1 )

这条线正在打破你的成本和你的变量之间的路径

相关内容

  • 没有找到相关文章

最新更新