假设我有一个非常简单的神经网络,如多层感知器。对于每一层,激活功能都是S形,并且网络完全连接。TensorFlow培训
在TensorFlow这可能是这样定义的:
sess = tf.InteractiveSession()
# Training Tensor
x = tf.placeholder(tf.float32, shape = [None, n_fft])
# Label Tensor
y_ = tf.placeholder(tf.float32, shape = [None, n_fft])
# Declaring variable buffer for weights W and bias b
# Layer structure [n_fft, n_fft, n_fft, n_fft]
# Input -> Layer 1
struct_w = [n_fft, n_fft]
struct_b = [n_fft]
W1 = weight_variable(struct_w, 'W1')
b1 = bias_variable(struct_b, 'b1')
h1 = tf.nn.sigmoid(tf.matmul(x, W1) + b1)
# Layer1 -> Layer 2
W2 = weight_variable(struct_w, 'W2')
b2 = bias_variable(struct_b, 'b2')
h2 = tf.nn.sigmoid(tf.matmul(h1, W2) + b2)
# Layer2 -> output
W3 = weight_variable(struct_w, 'W3')
b3 = bias_variable(struct_b, 'b3')
y = tf.nn.sigmoid(tf.matmul(h2, W3) + b3)
# Calculating difference between label and output using mean square error
mse = tf.reduce_mean(tf.square(y - y_))
# Train the Model
# Gradient Descent
train_step = tf.train.GradientDescentOptimizer(0.3).minimize(mse)
该模型的设计目标是FFT频谱映射n_fft
点到另一个n_fft
目标频谱。我们假设训练数据和目标数据的大小都是[3000, n_fft]
。它们存储在变量spec_train
和spec_target
中。
现在问题来了。对于TensorFlow,这两种训练有什么区别?
培训1:
for i in xrange(200):
train_step.run(feed_dict = {x: spec_train, y_: spec_target})
培训2:
for i in xrange(200):
for j in xrange(3000):
train = spec_train[j, :].reshape(1, n_fft)
label = spec_target[j, :].reshape(1, n_fft)
train_step.run(feed_dict = {x: train, y_: label})
非常感谢您!
这是我从您的文章了。在版本1中,权重和偏差不会更新,直到程序将整批数据提供给模型。这意味着3000个数据点会产生一个很大的重量调整。对于版本2,就像我使用3000个数据点来更新权重3000次,3000次小重量调整。它是否正确?谢谢。 – yc2986
这是正确的,是的。如果你做了3000次单独的更新,后面的更新将使用更多的参数版本,这将改进收敛性(每个数据点经过训练)。 – mrry
@mrry你能解释为什么“一次处理单个元素在理论上是可取的”?我一直认为更大批量更好。 –