【实验总结】关于tensorflow batch,None,-1的总结

1.batch,iterations,epochs

1.1 batch

深度学习的优化算法,说白了就是梯度下降。每次的参数更新有两种方式。

第一种,遍历全部数据集算一次损失函数,然后算函数对各个参数的梯度,更新梯度。这种方法每更新一次参数都要把数据集里的所有样本都看一遍,计算量开销大,计算速度慢,不支持在线学习,这称为Batch gradient descent,批梯度下降。

另一种,每看一个数据就算一下损失函数,然后求梯度更新参数,这个称为随机梯度下降,stochastic gradient descent。这个方法速度比较快,但是收敛性能不太好,可能在最优点附近晃来晃去,hit不到最优点。两次参数的更新也有可能互相抵消掉,造成目标函数震荡的比较剧烈。

为了克服两种方法的缺点,现在一般采用的是一种折中手段,mini-batch gradient decent,小批的梯度下降,这种方法把数据分为若干个批,按批来更新参数,这样,一个批中的一组数据共同决定了本次梯度的方向,下降起来就不容易跑偏,减少了随机性。另一方面因为批的样本数与整个数据集相比小了很多,计算量也不是很大。

基本上现在的梯度下降都是基于mini-batch的,所以深度学习框架的函数中经常会出现batch_size,就是指这个

1.2 iterations

iterations(迭代):每一次迭代都是一次权重更新,每一次权重更新需要batch_size个数据进行Forward运算得到损失函数,再BP算法更新参数。1个iteration等于使用batchsize个样本训练一次。

1.3 epochs 

epochs被定义为向前和向后传播中所有批次的单次训练迭代。这意味着1个周期是整个输入数据的单次向前和向后传递。简单说,epochs指的就是训练过程中数据将被“轮”多少次,就这样。

举个例子

训练集有1000个样本,batchsize=10,那么: 
训练完整个样本集需要: 
100次iteration,1次epoch。

具体的计算公式为: 
one epoch = numbers of iterations = N = 训练样本的数量/batch_size

2 -1是的使用

2.1 [-1]、[:-1]、[::-1]、[n::-1]

import numpy as np
a=np.random.rand(5)
print(a)
[ 0.64061262  0.8451399   0.965673    0.89256687  0.48518743]
 
print(a[-1]) ###取最后一个元素
[0.48518743]
 
print(a[:-1])  ### 除了最后一个取全部
[ 0.64061262  0.8451399   0.965673    0.89256687]
 
print(a[::-1]) ### 取从后向前(相反)的元素
[ 0.48518743  0.89256687  0.965673    0.8451399   0.64061262]
 
print(a[2::-1]) ### 取从下标为2的元素翻转读取
[ 0.965673  0.8451399   0.64061262]

2.2 reshape 中的-1

tf.reshape(tensor, shape, name=None)
函数的作用是将tensor变换为参数shape的形式。
其中shape为一个列表形式,特殊的一点是列表中可以存在-1。-1代表的含义是不用我们自己指定这一维的大小,函数会自动计算,但列表中只能存在一个-1。(当然如果存在多个-1,就是一个存在多解的方程了),可参见官网reshape的说明


-1 的应用:-1 表示不知道该填什么数字合适的情况下,可以选择,由python通过a和其他的值3推测出来,比如,这里的a 是二维的数组,数组中共有6个元素,当使用reshape()时,6/3=2,所以形成的是3行2列的二维数组,可以看出,利用reshape进行数组形状的转换时,一定要满足(x,y)中x×y=数组的个数。
 

>>>a = np.array([[1,2,3],[4,5,6]])
>>>np.reshape(a,(3,-1)) 
array([[1, 2],
       [3, 4],
       [5, 6]])
>>> np.reshape(a,(1,-1))
array([[1, 2, 3, 4, 5, 6]])
>>> np.reshape(a,(6,-1))
array([[1],
       [2],
       [3],
       [4],
       [5],
       [6]])
>>> np.reshape(a,(-1,1))
array([[1],
       [2],
       [3],
       [4],
       [5],
       [6]])

3 tensorflow中的None

在设置tensor的shape时,可以通过None告诉tensorflow,在这个维度上可以接受任意长度的数据,意即,可以是1个,2个,…,N个。

但是,应该只在一个维度上使用None,通常用在第一个维度上,一般的用来表示batch的大小,如果是None,即表示接受任意大小的batch_size。比如在RNN生成文本的例子中,我们通过训练得到了一个模型,那么在预测时需要重构模型,将输入的shape修改为(None,65),就可以使用任意长度的输入字符串来开始预测流程了

在keras中,数据是以张量的形式表示的,张量的形状称之为shape,表示从最外层向量逐步到达最底层向量的降维解包过程。

比如,一个一阶的张量[1,2,3]的shape是(3,); 一个二阶的张量[[1,2,3],[4,5,6]]的shape是(2,3); 一个三阶的张量[[[1],[2],[3]],[[4],[5],[6]]]的shape是(2,3,1)。

input_shape就是指输入张量的shape。例如,input_dim=784,说明输入是一个784维的向量,这相当于一个一阶的张量,它的shape就是(784,)。因此,input_shape=(784,)。

input_dim = input_shape(input_dim,)

input_dim, input_length = input_shape(input_length, input_dim)

3.1 shape为0的情形

sess = tf_reset()
a = tf.placeholder(tf.float32, shape=(),name="a_placeholder")
b = tf.placeholder(tf.float32, shape=(),name="b_placeholder")
c = a + b
print(sess.run(c, feed_dict={a:1.,b:2.}))

-> 3.0

3.2 一维张量的情形

sess = tf_reset()
a = tf.placeholder(tf.float32, shape=(1),name="a_placeholder")
b = tf.placeholder(tf.float32, shape=(1),name="b_placeholder")
c = a + b
print(sess.run(c, feed_dict={a:[1.],b:[2.]}))

[4. 6.]

 使用None接收任意长度的一维向量

sess = tf_reset()
a = tf.placeholder(tf.float32, shape=(None),name="a_placeholder")
b = tf.placeholder(tf.float32, shape=(None),name="b_placeholder")
c = a + b
print(sess.run(c, feed_dict={a:[1., 2., 3.],b:[4., 5., 6.]}))

[5. 7. 9.]

 3.3 多维向量中的None

sess = tf_reset()
a = tf.placeholder(tf.float32, shape=(None,2),name="a_placeholder")
b = tf.placeholder(tf.float32, shape=(None,2),name="b_placeholder")
c = a + b
print(sess.run(c, feed_dict={a:[[1., 2.],[3., 4.]],b:[[5., 6.],[7., 8.]]}))
[[ 6.  8.]
 [10. 12.]]

 

参考文献:

[1] 深度学习中的 Batch_Size:https://blog.csdn.net/qq_29828623/article/details/78076850

[2] tensorflow中的None

[3] keras理解

你可能感兴趣的:(实验)