首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TensorFlow训练

TensorFlow训练
EN

Stack Overflow用户
提问于 2015-12-04 21:07:24
回答 2查看 5K关注 0票数 27

假设我有一个非常简单的神经网络,就像多层感知器。对于每一层,激活函数为sigmoid,网络完全连接。

在TensorFlow中,可以这样定义:

代码语言:javascript
复制
    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_trainspec_target中。

现在问题来了。对于TensorFlow来说,这两种训练有什么区别吗?

培训1:

代码语言:javascript
复制
for i in xrange(200):
        train_step.run(feed_dict = {x: spec_train, y_: spec_target})

培训2:

代码语言:javascript
复制
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})

非常感谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-12-04 21:26:36

在第一个培训版本中,您将同时培训整个培训数据,这意味着spec_train的第一个和第3000个元素将在一个步骤中使用相同的模型参数进行处理。这被称为(批处理)梯度下降

在第二个培训版本中,您将同时从培训数据中培训一个示例,这意味着spec_train的第3000个元素将使用自最近处理第一个元素以来已更新2999次的模型参数进行处理。这被称为随机梯度下降(或者如果元素是随机选择的话)。

通常,TensorFlow与大到不能在一批处理的数据集一起使用,因此倾向于使用小型批处理SGD (其中示例的子集在一步内处理)。一次处理单个元素在理论上是可取的,但由于矩阵乘法和其他运算的计算密度不高,因此具有内在的顺序性和较高的固定成本。因此,同时处理一小批(例如32或128)的示例是通常的方法,在不同的批次上并行进行多个副本的培训。

有关何时使用一种方法与另一种方法的更多理论讨论,请参见此Stats StackExchange question

票数 36
EN

Stack Overflow用户

发布于 2017-04-04 18:58:24

是的有区别。我认为第二种方式的损失函数可能会有点混乱。更像是在线培训。对于整个批处理中的每个数据点,您将更新所有参数。但是在第一种情况下,它被称为批梯度,您每次取一个批,取平均损失,然后更新参数。

请参考这个链接https://stats.stackexchange.com/questions/49528/batch-gradient-descent-versus-stochastic-gradient-descent的第一个答案在这个链接中真的很好

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34097457

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档