TensorFlow 培训
TensorFlow Training
假设我有一个非常简单的神经网络,比如多层感知器。对于每一层,激活函数都是 sigmoid 并且网络是完全连接的。
在 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)
此模型的设计目标是将 n_fft
点 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})
非常感谢!
在第一个训练版本中,您一次训练整批训练数据,这意味着 spec_train
的第一个和第 3000 个元素将使用相同的模型参数在一个步骤中处理.这被称为 (Batch) 梯度下降。
在第二个训练版本中,您一次从训练数据中训练一个样本,这意味着 spec_train
的第 3000 个元素将使用自上次训练以来已更新 2999 次的模型参数进行处理第一个元素是最近处理的。这被称为随机梯度下降(或者如果元素是随机选择的)。
通常,TensorFlow 用于处理太大而无法在一个批次中处理的数据集,因此小批量 SGD(其中示例的一个子集在一个步骤中处理)更受欢迎。一次处理单个元素在理论上是可取的,但本质上是顺序的并且具有高固定成本,因为矩阵乘法和其他操作的计算密度不高。因此,一次处理一小批(例如 32 或 128 个)示例是通常的方法,多个副本在不同批次上并行训练。
请参阅此 Stats StackExchange question 以获得关于何时应使用一种方法与另一种方法的更理论性的讨论。
是的,有区别。我认为第二种损失函数可能有点混乱。这更像是在线培训。对于整批中的每个数据点,您更新所有参数。但在第一种方式中,它被称为批量梯度,您一次获取一批并计算平均损失,然后更新参数。
请参考这个link
https://stats.stackexchange.com/questions/49528/batch-gradient-descent-versus-stochastic-gradient-descent
第一个回答真的很好 link
假设我有一个非常简单的神经网络,比如多层感知器。对于每一层,激活函数都是 sigmoid 并且网络是完全连接的。
在 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)
此模型的设计目标是将 n_fft
点 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})
非常感谢!
在第一个训练版本中,您一次训练整批训练数据,这意味着 spec_train
的第一个和第 3000 个元素将使用相同的模型参数在一个步骤中处理.这被称为 (Batch) 梯度下降。
在第二个训练版本中,您一次从训练数据中训练一个样本,这意味着 spec_train
的第 3000 个元素将使用自上次训练以来已更新 2999 次的模型参数进行处理第一个元素是最近处理的。这被称为随机梯度下降(或者如果元素是随机选择的)。
通常,TensorFlow 用于处理太大而无法在一个批次中处理的数据集,因此小批量 SGD(其中示例的一个子集在一个步骤中处理)更受欢迎。一次处理单个元素在理论上是可取的,但本质上是顺序的并且具有高固定成本,因为矩阵乘法和其他操作的计算密度不高。因此,一次处理一小批(例如 32 或 128 个)示例是通常的方法,多个副本在不同批次上并行训练。
请参阅此 Stats StackExchange question 以获得关于何时应使用一种方法与另一种方法的更理论性的讨论。
是的,有区别。我认为第二种损失函数可能有点混乱。这更像是在线培训。对于整批中的每个数据点,您更新所有参数。但在第一种方式中,它被称为批量梯度,您一次获取一批并计算平均损失,然后更新参数。
请参考这个link https://stats.stackexchange.com/questions/49528/batch-gradient-descent-versus-stochastic-gradient-descent 第一个回答真的很好 link