Neural network 张量流训练

Neural network 张量流训练,neural-network,tensorflow,Neural Network,Tensorflow,假设我有一个非常简单的神经网络,比如多层感知器。对于每一层,激活功能为sigmoid,网络完全连接 在TensorFlow中,可以这样定义: sess=tf.InteractiveSession() #训练张量 x=tf.placeholder(tf.float32,shape=[None,n\u fft]) #标号张量 y=tf.placeholder(tf.float32,shape=[None,n\u fft]) #声明权重W和偏差b的变量缓冲区 #层结构[n_fft,n_fft,n_ff

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

在TensorFlow中,可以这样定义:

sess=tf.InteractiveSession()
#训练张量
x=tf.placeholder(tf.float32,shape=[None,n\u fft])
#标号张量
y=tf.placeholder(tf.float32,shape=[None,n\u fft])
#声明权重W和偏差b的变量缓冲区
#层结构[n_fft,n_fft,n_fft,n_fft]
#输入->第1层
结构w=[n\u fft,n\u fft]
结构b=[n\u fft]
W1=重量变量(结构w,'W1')
b1=偏差变量(结构b,‘b1’)
h1=tf.nn.sigmoid(tf.matmul(x,W1)+b1)
#第1层->第2层
W2=权重变量(结构w,'W2')
b2=偏差变量(结构b,‘b2’)
h2=tf.nn.sigmoid(tf.matmul(h1,W2)+b2)
#第二层->输出
W3=权重变量(结构w,'W3')
b3=偏差变量(结构b,'b3')
y=tf.nn.sigmoid(tf.matmul(h2,W3)+b3)
#使用均方误差计算标签和输出之间的差异
均方误差=tf.约化平均值(tf.平方(y-y))
#训练模型
#梯度下降
列车步长=tf.列车梯度降阶器(0.3).最小化(mse)
该模型的设计目标是将一个
n_fft
点fft谱图映射到另一个
n_fft
目标谱图。让我们假设训练数据和目标数据的大小都是
[3000,n\u fft]
。它们存储在变量
spec\u-train
spec\u-target

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

培训1:

X范围(200)内的i的
:
训练步骤。运行(feed_dict={x:spec_训练,y:spec_目标})
培训2:

X范围(200)内的i的
:
对于X范围内的j(3000):
序列=规格序列[j,:]。重塑(1,n\u fft)
标签=规格目标[j,:]。重塑(1,n)
train_step.run(feed_dict={x:train,y_u:label})

多谢各位

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

在第二个培训版本中,您将立即从培训数据中培训单个示例,这意味着将使用自最近处理第一个元素以来已更新2999次的模型参数来处理
spec\u train
的第3000个元素。这被称为随机梯度下降(如果元素是随机选择的,也可能是这样)

一般来说,TensorFlow用于太大而无法在一个批次中处理的数据集,所以小型批次SGD(其中示例的子集在一个步骤中处理)受到青睐。从理论上讲,一次处理单个元素是可取的,但由于矩阵乘法和其他运算的计算密度不高,因此本质上是顺序的,并且具有较高的固定成本。因此,一次处理一小批(例如32或128)示例是通常的方法,多个副本并行地在不同批次上进行训练


关于何时应使用一种方法与另一种方法的更多理论讨论,请参见本节。

是的,存在差异。我认为第二种方式的损失函数可能有点混乱。这更像是在线培训。对于整个批次中的每个数据点,更新所有参数。但在第一种方法中,它被称为批次梯度,你一次取一个批次,取平均损失,然后更新参数

请参考此链接
第一个答案在这个链接中非常好

这是我从你的帖子中得到的。在版本1中,权重和偏差将不会更新,直到程序将整批数据提供给模型。这意味着3000个数据点将产生一次大的重量调整。对于版本2,我使用了3000个数据点来更新3000次重量,3000次小的重量调整。这是正确的吗?谢谢,没错。如果您进行3000次单独的更新,以后的更新将使用更多最新版本的参数,这将有助于提高收敛性(每个经过训练的数据点)。@mrry您能否解释为什么“一次处理一个元素在理论上是可取的”?我一直认为批量越大越好。通过一次处理单个元素,您将更频繁地更新权重,因此,以后的计算可以利用更多“进化”的网络权重,可能导致更好的收敛性(更高的精度)。然而,单元素处理对GPU计算的占用率较低,导致计算吞吐量较低,因此训练时间较长。相比之下,批量较大,亲:训练速度快;缺点:收敛性差(准确性差)。嗨,我只是想知道更新的细节是如何工作的。如果我成批运行训练数据,它们是否都是按顺序计算的,然后计算梯度并处理更新?或者是并行进行,即批处理中的数据在多个线程中同时处理,直到可以计算梯度(并且(同步地)更新)?如果我在每次训练数据之后更新模型,我假设它是同步完成的?