Python TensorFlow中简单前馈神经网络GPU训练的有效示例实现?也许是tf数据?
我刚开始使用TensorFlow的GPU版本,希望它能加快前馈神经网络的训练。我能够在我的GPU(GTX1080ti)上进行训练,但不幸的是,它并没有明显快于在我的CPU(i7-8700K)上进行同样的训练,而我目前的实现方式就是这样。在培训期间,GPU几乎没有被使用,这让我怀疑我的实现中的瓶颈是如何使用feed_dict将数据从主机复制到设备 我听说TensorFlow有一个叫做“tf.data”的管道,该管道可以使向GPU等提供数据变得更容易、更快速。但是,我还没有找到任何简单的例子,在这些例子中,这个概念被应用到多层感知器训练中,以替代feed_dict 有人知道这样一个例子吗?能给我指一下吗?最好尽可能简单,因为我对TensorFlow基本上是新手。或者在我当前的实现中是否还有其他需要更改的内容以提高效率?我正在粘贴我在这里的代码:Python TensorFlow中简单前馈神经网络GPU训练的有效示例实现?也许是tf数据?,python,python-3.x,tensorflow,Python,Python 3.x,Tensorflow,我刚开始使用TensorFlow的GPU版本,希望它能加快前馈神经网络的训练。我能够在我的GPU(GTX1080ti)上进行训练,但不幸的是,它并没有明显快于在我的CPU(i7-8700K)上进行同样的训练,而我目前的实现方式就是这样。在培训期间,GPU几乎没有被使用,这让我怀疑我的实现中的瓶颈是如何使用feed_dict将数据从主机复制到设备 我听说TensorFlow有一个叫做“tf.data”的管道,该管道可以使向GPU等提供数据变得更容易、更快速。但是,我还没有找到任何简单的例子,在这些
import tensorflow as tf
import numpy as np
from sklearn import datasets
from sklearn.model_selection import train_test_split
tf.reset_default_graph()
import time
# Function for iris dataset.
def get_iris_data():
iris = datasets.load_iris()
data = iris["data"]
target = iris["target"]
# Convert to one-hot vectors
num_labels = len(np.unique(target))
all_Y = np.eye(num_labels)[target]
return train_test_split(data, all_Y, test_size=0.33, random_state=89)
# Function which initializes tensorflow weights & biases for feed-forward NN.
def InitWeights(LayerSizes):
with tf.device('/gpu:0'):
# Make tf placeholders for network inputs and outputs.
X = tf.placeholder( shape = (None,LayerSizes[0]),
dtype = tf.float32,
name ='InputData')
y = tf.placeholder( shape = (None,LayerSizes[-1]),
dtype = tf.float32,
name ='OutputData')
# Initialize weights and biases.
W = {}; b = {};
for ii in range(len(LayerSizes)-1):
layername = f'layer%s' % ii
with tf.variable_scope(layername):
ny = LayerSizes[ii]
nx = LayerSizes[ii+1]
# Weights (initialized with xavier initializatiion).
W['Weights_'+layername] = tf.get_variable(
name = 'Weights_'+layername,
shape = (ny, nx),
initializer = tf.contrib.layers.xavier_initializer(),
dtype = tf.float32
)
# Bias (initialized with xavier initializatiion).
b['Bias_'+layername] = tf.get_variable(
name = 'Bias_'+layername,
shape = (nx),
initializer = tf.contrib.layers.xavier_initializer(),
dtype = tf.float32
)
return W, b, X, y
# Function for forward propagation of NN.
def FeedForward(X, W, b):
with tf.device('/gpu:0'):
# Initialize 'a' of first layer to the placeholder of the network input.
a = X
# Loop all layers of the network.
for ii in range(len(W)):
# Use name of each layer as index.
layername = f'layer%s' % ii
## Weighted sum: z = input*W + b
z = tf.add(tf.matmul(a, W['Weights_'+layername], name = 'WeightedSum_z_'+layername), b['Bias_'+layername])
## Passed through actication fcn: a = h(z)
if ii == len(W)-1:
a = z
else:
a = tf.nn.relu(z, name = 'activation_a_'+layername)
return a
if __name__ == "__main__":
# Import data
train_X, test_X, train_y, test_y = get_iris_data()
# Define network size [ninputs-by-256-by-outputs]
LayerSizes = [4, 256, 3]
# Initialize weights and biases.
W, b, X, y = InitWeights(LayerSizes)
# Define loss function to optimize.
yhat = FeedForward(X, W, b)
loss = tf.reduce_sum(tf.square(y - yhat),reduction_indices=[0])
# Define optimizer to use when minimizing loss function.
all_variables = tf.trainable_variables()
optimizer = tf.train.GradientDescentOptimizer(learning_rate = 0.0001)
train_op = optimizer.minimize(loss, var_list = all_variables)
# Start tf session and initialize variables.
sess = tf.Session()
sess.run(tf.global_variables_initializer())
# Train 10000 minibatches and time how long it takes.
t0 = time.time()
for i in range(10000):
ObservationsToUse = np.random.choice(len(train_X), 32)
X_minibatch = train_X[ObservationsToUse,:]
y_minibatch = train_y[ObservationsToUse,:]
sess.run(train_op, feed_dict={X : X_minibatch, y : y_minibatch})
t1 = time.time()
print('Training took %0.2f seconds' %(t1-t0))
sess.close()
速度可能较低,因为:
- 您正在创建占位符。使用numpy,我们将数据插入 占位符,从而将它们转换为图的张量
with np.load("/var/data/training_data.npy") as data:
features = data["features"]
labels = data["labels"]
# Assume that each row of `features` corresponds to the same row as `labels`.
assert features.shape[0] == labels.shape[0]
dataset = tf.data.Dataset.from_tensor_slices((features, labels))
一些有用的功能:
dataset = dataset.shuffle(buffer_size=10000)
dataset = dataset.batch(32) # Creating batches
dataset = dataset.repeat(num_epochs) # repeat the dataset 'N' times
iterator = dataset.make_one_shot_iterator() # Create a iterator to retrieve batches of data
X, Y = iterator.get_next()
这里,32是批大小。
就你而言
dataset = tf.data.Dataset.from_tensor_slices((data, targets))
因此,不需要占位符。直营,
session.run( train_op ) # no feed_dict!!
事实上,除了你在谷歌上能找到的任何东西之外,还有一些关于它的官方指南。谢谢你的回答。请原谅我的缓慢,我正试图更改我的示例代码以使用您提到的一些tf.data函数来替换占位符,但我遇到了一些问题。例如,如果我没有创建X和y占位符,那么如何定义网络的前馈计算?在我的函数“yhat=前馈(X,W,b)”中,占位符X用作输入。如果没有任何占位符,我如何编写前馈函数?使用批量数据。在我提供的代码中,“next_element”是一批数据,您可以在前馈网络中使用。此外,我在第二个代码段中做了一些更改。我想我使用X from
X,y=iterator.get_next()
实现了前馈函数。但是,当我想使用sess来训练网络时,run(train_op,feed_dict={X:X_minibatch,y:y_minibatch})其中X_minibatch
和y_minibatch
由X_minibatch,y_minibatch=iterator.get_next()生成
我收到一个tensorflow错误,告诉我tf。Tensor对象不能馈送。在向网络提供小批量数据时,我是否应该使用feed_dict?在使用Dataset时,您不需要任何需要输入的占位符。不需要占位符,也不是一种遮光罩惯例:-)