В настоящее время я изучаю Tensorflow, используя Практическое машинное обучение с Scikit-Learn & TensorFlow , и я играю с кодом, представленным в книге. Тем не менее, я нахожусь в замешательстве из-за выбора времени для «оптимизированной» функциональности Tensorflow.
Обсуждаются три подхода для получения градиентов.
- Версия, созданная вручную. ~ 1,5 секунды
- Использование функции градиентов TensorFlow ~ 5,0 секунд
- Использование 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")