我正在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 )
这条线正在打破你的成本和你的变量之间的路径