#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. Сделал свое дело! Еще раз спасибо за помощь в этом.