【实验总结】关于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_Sizehttps://blog.csdn.net/qq_29828623/article/details/78076850

[2] tensorflow中的None

[3] keras理解

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
卷积神经网络(Convolutional Neural Network, CNN)是深度学习中非常重要的一种神经网络类型,主要应用于图像识别、语音识别等领域。在本次实验中,我们使用 TensorFlow 搭建了一个简单的 CNN 模型,用于对 MNIST 数据集中的手写数字进行识别。 实验流程如下: 1. 数据预处理 首先,我们通过 TensorFlow 的 `input_data` 模块从网上下载了 MNIST 数据集,并进行了简单的预处理,将像素值从 0-255 转换为 0-1 的浮点数。我们还对标签进行了 one-hot 编码,以便在训练时使用交叉熵损失函数。 ```python mnist = input_data.read_data_sets("MNIST_data/", one_hot=True) ``` 2. 搭建 CNN 模型 我们的 CNN 模型包含两个卷积层和两个全连接层,其中每个卷积层之后都跟着一个 max pooling 层,用于进行下采样和特征提取。我们还使用了 ReLU 激活函数来增加模型的非线性性。 ```python # 定义输入数据的占位符 x = tf.placeholder(tf.float32, shape=[None, 28, 28, 1]) y_true = tf.placeholder(tf.float32, shape=[None, 10]) # 定义第一个卷积层,使用32个5x5的卷积核 conv_1 = tf.layers.conv2d(inputs=x, filters=32, kernel_size=(5, 5), activation=tf.nn.relu) # 定义第一个池化层,使用2x2的池化窗口 pool_1 = tf.layers.max_pooling2d(inputs=conv_1, pool_size=(2, 2), strides=2) # 定义第二个卷积层,使用64个5x5的卷积核 conv_2 = tf.layers.conv2d(inputs=pool_1, filters=64, kernel_size=(5, 5), activation=tf.nn.relu) # 定义第二个池化层,使用2x2的池化窗口 pool_2 = tf.layers.max_pooling2d(inputs=conv_2, pool_size=(2, 2), strides=2) # 将池化层输出展平 flatten = tf.layers.flatten(pool_2) # 定义全连接层 fc = tf.layers.dense(inputs=flatten, units=1024, activation=tf.nn.relu) # 定义输出层 logits = tf.layers.dense(inputs=fc, units=10) ``` 3. 定义损失函数和优化器 我们使用交叉熵损失函数来衡量模型的预测结果与真实标签之间的差距,并使用 Adam 优化器来最小化损失函数。 ```python # 定义损失函数 cross_entropy = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_true, logits=logits)) # 定义优化器 optimizer = tf.train.AdamOptimizer(learning_rate=0.001) train = optimizer.minimize(cross_entropy) ``` 4. 训练模型 我们使用 mini-batch 的方式进行训练,每次随机从训练集中抽取一定数量的样本进行训练,并计算损失函数和准确率。在训练过程中,我们使用 TensorFlow 的 `Session` 对象来运行计算图,并通过 feed_dict 参数将训练数据传递给模型。 ```python # 定义准确率计算方法 correct_prediction = tf.equal(tf.argmax(logits, 1), tf.argmax(y_true, 1)) accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) # 初始化变量 init = tf.global_variables_initializer() # 训练模型 with tf.Session() as sess: sess.run(init) for i in range(1000): batch_x, batch_y = mnist.train.next_batch(100) sess.run(train, feed_dict={x: batch_x, y_true: batch_y}) if i % 100 == 0: acc = sess.run(accuracy, feed_dict={x: mnist.test.images, y_true: mnist.test.labels}) print("Step " + str(i) + ", Testing Accuracy= " + str(acc)) ``` 5. 实验结果 在经过约 1000 次迭代后,我们的模型在测试集上的准确率达到了 0.987。这说明我们的 CNN 模型能够有效地对手写数字进行识别。 总结: 本次实验中,我们通过 TensorFlow 搭建了一个简单的 CNN 模型,并使用 MNIST 数据集对其进行了训练和测试。通过实验,我们深入了解了卷积神经网络的原理和实现方式,并掌握了使用 TensorFlow 搭建 CNN 模型的方法。同时,我们还学习了如何进行数据预处理、定义损失函数和优化器、训练和测试模型等基本技能,这些对于进一步学习深度学习和神经网络非常有帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刘大望

谢谢你请的咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值