Вычислительная эффективность функции градиентов тензорного потока - PullRequest
0 голосов
/ 30 апреля 2020

В настоящее время я изучаю Tensorflow, используя Практическое машинное обучение с Scikit-Learn & TensorFlow , и я играю с кодом, представленным в книге. Тем не менее, я нахожусь в замешательстве из-за выбора времени для «оптимизированной» функциональности Tensorflow.

Обсуждаются три подхода для получения градиентов.

  1. Версия, созданная вручную. ~ 1,5 секунды
  2. Использование функции градиентов TensorFlow ~ 5,0 секунд
  3. Использование GradientDescentOptimizer TensorFlow ~ 5,0 секунд

Я ожидаю, что параметры будут работать быстрее (более оптимизированы) от 1 до 3. Однако первый вариант кажется в 3 раза быстрее. Кто-нибудь может пролить свет на это странное поведение?

Я использую Tensorflow 1.14 и код ниже.

import tensorflow as tf
import numpy as np
from sklearn.datasets import fetch_california_housing
from sklearn.preprocessing import StandardScaler
import time

start=time.perf_counter_ns()

print("get housing data")
housing = fetch_california_housing()
m , n = housing.data.shape
housing_data_plus_bias = np.c_[np.ones((m,1)), housing.data]
scaler=StandardScaler()
scaled_housing_data_plus_bias = scaler.fit_transform(housing_data_plus_bias) 

print("Make Tensorflow variables")
n_epochs = 5000
learning_rate = 0.01

X = tf.constant(scaled_housing_data_plus_bias, dtype=tf.float32, name="X")
y = tf.constant(housing.target.reshape(-1,1),dtype=tf.float32, name="y")
theta = tf.Variable(tf.random.uniform([n+1,1],-1.0,1.0),name="theta")
y_pred=tf.matmul(X,theta,name="predictions")
error=y_pred - y
mse=tf.reduce_mean(tf.square(error),name="mse")
##1## Manual calculation of gradients
#gradients=2/m * tf.matmul(tf.transpose(X),error)
#training_op=tf.compat.v1.assign(theta, theta - learning_rate * gradients)

##2## using Autodiff 
#gradients=tf.gradients(mse,[theta])[0]
#training_op=tf.compat.v1.assign(theta, theta - learning_rate * gradients)

##3## using Optimizer 
optimizer=tf.compat.v1.train.GradientDescentOptimizer(learning_rate=learning_rate)
training_op=optimizer.minimize(mse)

init = tf.compat.v1.global_variables_initializer()
print("run stuff")
with tf.compat.v1.Session() as sess:
    sess.run(init)
    for epoch in range(n_epochs):
        if (epoch+1) % 1000 == 0:
            print("epoch ",epoch+1," MSE = ",mse.eval())
        sess.run(training_op)

    best_theta = theta.eval()

end=time.perf_counter_ns()
print("done. Theta=",best_theta,"\n Timing=",(end-start)/1.0E6," ms")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...