Tôi đã làm việc với convnetjs trong 1 năm và bây giờ tôi muốn chuyển sang các thư viện mạnh mẽ và nhanh hơn. Tôi nghĩ Tensorflow sẽ là đơn đặt hàng của cường độ nhanh hơn so với một thư viện JS, vì vậy tôi đã viết một mạng lưới thần kinh đơn giản cho cả hai thư viện và đã làm một số xét nghiệm. Nó là một mạng nơ-ron 3-5-5-1, được huấn luyện trên một ví dụ duy nhất cho một số kỷ nguyên nhất định với các lớp SGD và RELU.Tại sao tốc độ chậm hơn Tensorflow 100x so với convnetj trong ví dụ NN đơn giản này?
đang Tensorflow:
import tensorflow as tf
import numpy
import time
NUM_CORES = 1 # Choose how many cores to use.
sess = tf.Session(config=tf.ConfigProto(inter_op_parallelism_threads=NUM_CORES, intra_op_parallelism_threads=NUM_CORES))
# Parameters
learning_rate = 0.001
training_epochs = 1000
batch_size = 1
# Network Parameters
n_input = 3 # Data input
n_hidden_1 = 5 # 1st layer num features
n_hidden_2 = 5 # 2nd layer num features
n_output = 1 # Data output
# tf Graph input
x = tf.placeholder("float", [None, n_input], "a")
y = tf.placeholder("float", [None, n_output], "b")
# Create model
def multilayer_perceptron(_X, _weights, _biases):
layer_1 = tf.nn.relu(tf.add(tf.matmul(_X, _weights['h1']), _biases['b1'])) #Hidden layer with RELU activation
layer_2 = tf.nn.relu(tf.add(tf.matmul(layer_1, _weights['h2']), _biases['b2'])) #Hidden layer with RELU activation
return tf.matmul(layer_2, _weights['out']) + _biases['out']
# Store layers weight & bias
weights = {
'h1': tf.Variable(tf.random_normal([n_input, n_hidden_1])),
'h2': tf.Variable(tf.random_normal([n_hidden_1, n_hidden_2])),
'out': tf.Variable(tf.random_normal([n_hidden_2, n_output]))
}
biases = {
'b1': tf.Variable(tf.random_normal([n_hidden_1])),
'b2': tf.Variable(tf.random_normal([n_hidden_2])),
'out': tf.Variable(tf.random_normal([n_output]))
}
# Construct model
pred = multilayer_perceptron(x, weights, biases)
# Define loss and optimizer
cost = tf.reduce_sum(tf.nn.l2_loss(pred-y))/batch_size # L2 loss
optimizer = tf.train.GradientDescentOptimizer(learning_rate=learning_rate).minimize(cost) # Adam Optimizer
# Initializing the variables
init = tf.initialize_all_variables()
# Launch the graph
sess.run(init)
# Training Data
train_X = numpy.asarray([[0.1,0.2,0.3]])
train_Y = numpy.asarray([[0.5]])
# Training cycle
start = time.clock()
for epoch in range(training_epochs):
# Fit training using batch data
sess.run(optimizer, feed_dict={x: train_X, y: train_Y})
end = time.clock()
print end - start #2.5 seconds -> 400 epochs per second
print "Optimization Finished!"
mã JS:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>Regression example convnetjs</title>
<script src="http://cs.stanford.edu/people/karpathy/convnetjs/build/convnet.js"></script>
<script src="http://cs.stanford.edu/people/karpathy/convnetjs/build/util.js"></script>
<script>
var layer_defs, net, trainer;
function start() {
layer_defs = [];
layer_defs.push({ type: 'input', out_sx: 1, out_sy: 1, out_depth: 3 });
layer_defs.push({ type: 'fc', num_neurons: 5, activation: 'relu' });
layer_defs.push({ type: 'fc', num_neurons: 5, activation: 'relu' });
layer_defs.push({ type: 'regression', num_neurons: 1 });
net = new convnetjs.Net();
net.makeLayers(layer_defs);
trainer = new convnetjs.SGDTrainer(net, { learning_rate: 0.001, method: 'sgd', batch_size: 1, l2_decay: 0.001, l1_decay: 0.001 });
var start = performance.now();
for(var i = 0; i < 100000; i++) {
var x = new convnetjs.Vol([0.1, 0.2, 0.3]);
trainer.train(x, [0.5]);
}
var end = performance.now();
console.log(end-start); //3 seconds -> 33333 epochs per second
var predicted_values = net.forward(x);
console.log(predicted_values.w[0]);
}
</script>
</head>
<body>
<button onclick="start()">Start</button>
</body>
</html>
Kết quả là rằng convnetjs xe lửa cho 100.000 kỷ nguyên trong 3 giây, trong khi Tensorflow huấn luyện cho 1000 kỷ nguyên trong 2,5 giây. Đây có phải là dự kiến không?
Tôi cũng nghĩ rằng để tận dụng tối đa Tensorflow, bạn nên sử dụng nhiều nút và có thể là GPU; thật không may, tôi chạy hầu hết mã của tôi trên một CPU duy nhất. Nhưng dù sao, tôi nên chỉ ra rằng 1) convnetjs chạy trên một lõi đơn, nó đã không có bất kỳ tối ưu hóa để chạy song song (ít nhất là bởi chính nó) 2) Tôi đã thử sử dụng 4 lõi trong Tensorflow trên một máy quad-core, nhưng nó chậm hơn so với sử dụng 1 lõi (nhưng điều này đã được mong đợi). – okh
những câu trả lời này là đập theo ý kiến của tôi. mạng của bạn là siêu nhỏ và một lõi là đủ để chạy nó nhanh như nó sẽ bao giờ chạy. thêm chi phí của TF và bạn sẽ mất. làm cho 10 lớp với 100 đơn vị mỗi và sau đó bạn sẽ thấy nơi nó tỏa sáng. (sử dụng gpu!) – user1269942