Время выполнения в Tensorflow выше, чем в Numpy - PullRequest
1 голос
/ 10 июня 2019

Я воспроизвожу пример «Градиентный спуск» из практического машинного обучения Джерона с Tensorflow и Numpy.Это странно, но даже с включенным графическим процессором Numpy работает в 5-6 раз быстрее, чем Tensorflow.

Мне интересно, что я делаю неправильно при настройке Tensorflow.Оба кода представлены ниже:

Первый тензор потока.Продолжительность: прибл.8 секунд

from sklearn.datasets import fetch_california_housing
dados = fetch_california_housing()
nlins, ncols = dados['data'].shape

minimos = np.min(dados['data'],axis=0)
maximos = np.max(dados['data'],axis=0)
intervalo = maximos - minimos
dados_n = (dados['data'] - minimos) / intervalo

import numpy as np
uns = np.ones(nlins).reshape(-1,1)
x = np.concatenate([uns, dados_n], axis=1)
y = dados['target'].reshape(-1,1)

eta = 0.1 
epocas = 10000 

import tensorflow as tf
X = tf.constant(x, dtype=tf.float32, name='X')
Y = tf.constant(y, dtype=tf.float32, name='Y')
beta = tf.Variable(tf.random_uniform([ncols + 1, 1],
                                     -1.0, 1.0,seed=42), name='beta')
Yhat = tf.matmul(X, beta, name='Yhat')
erro = Yhat - Y
mse = tf.reduce_mean(tf.square(erro), name='mse')
gradiente = 2/nlins * tf.matmul(tf.transpose(X), erro)
novo_beta = tf.assign(beta, beta - eta * gradiente)

init = tf.global_variables_initializer()

from time import time

sess = tf.InteractiveSession()
sess.run(init)
inicio = time()
for i in range(epocas):
    sess.run(novo_beta)
fim = time()
result = mse.eval()
sess.close()

tempo = fim - inicio
print("Tempo = %.2f" % tempo)
print("MSE = %.2f" % result) # 0.57

Теперь NumPy.Продолжительность: 1,50 секунды

epocas = 10000
eta = 0.1

import numpy as np
np.set_printoptions(precision=3)

from sklearn.datasets import fetch_california_housing
dados = fetch_california_housing()
nlins, ncols = dados['data'].shape
uns = np.ones(nlins).reshape(-1,1)

minimos = np.min(dados['data'],axis=0)
maximos = np.max(dados['data'],axis=0)
intervalo = maximos - minimos
dados_n = (dados['data'] - minimos)/intervalo

x = np.concatenate([uns,dados_n], axis=1)
y = dados['target'].reshape(-1,1)

np.random.seed(42)
beta = np.random.uniform(low=-1, high=1, size=9).reshape(-1,1)

from time import time
inicio = time()
for i in range(epocas):
    mse = np.mean(np.square(x.dot(beta)-y))
    gradiente = 2/nlins * x.T.dot(x.dot(beta)-y)
    beta = beta - eta * gradiente
fim = time()
tempo = fim - inicio
print("tempo = %.2f" % tempo) 
print("mse = %.2f" % mse) 

Что я делаю не так в реализации Tensorflow?

...