Tensor.name бессмысленно при нетерпеливом выполнении функции MSE

#python #tensorflow #keras

#python #тензорный поток #keras

Вопрос:

Я работаю над некоторыми упражнениями в Tensorflow 2.0, чтобы убедиться, что я правильно понимаю основы. Моя текущая задача — сопоставить регрессию с функцией MSE с использованием оптимизаторов keras. Однако, когда я пытаюсь запустить приведенный ниже код, я получаю эту ошибку ниже:

Ошибка атрибута: 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 = «output» и получил эту ошибку ниже:

Ошибка значения: градиенты не предусмотрены ни для одной переменной: [‘Переменная: 0’] .

Я проверил, есть ли что-нибудь в реализации, что могло бы помешать ее дифференциации, но прямо сейчас я не вижу ничего, кроме вызова tf.abs (удалено; проблема осталась).

Ответ №1:

Вы можете просто делать то, что подсказывает вам ошибка. Удалите имя

 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 )
 

Эта строка прерывает путь между вашей стоимостью и вашими переменными

Комментарии:

1. Спасибо за предложение! Я сделал так, как вы предложили, но когда я вношу это изменение, я получаю следующую ошибку ниже: > Ошибка значения: градиенты не предусмотрены ни для одной переменной: [‘Variable:0’] . Я проверил, есть ли что-нибудь в реализации, что могло бы помешать ее дифференциации, но прямо сейчас я не вижу ничего, кроме вызова tf.abs (удалено; проблема осталась).

2. я обновил свой ответ. В коде есть еще одна проблема

3. Сделал свое дело! Еще раз спасибо за помощь в этом.