一个模拟做实验的网站,西安优化网站,网站建设优化文章,网站ps照片怎么做- **#x1f368; 本文为[#x1f517;365天深度学习训练营](https://mp.weixin.qq.com/s/0dvHCaOoFnW8SCp3JpzKxg) 中的学习记录博客**
- **#x1f356; 原作者#xff1a;[K同学啊](https://mtyjkh.blog.csdn.net/)** 目录
一、前言
作为一名研究牲#xff0…- ** 本文为[365天深度学习训练营](https://mp.weixin.qq.com/s/0dvHCaOoFnW8SCp3JpzKxg) 中的学习记录博客**
- ** 原作者[K同学啊](https://mtyjkh.blog.csdn.net/)** 目录
一、前言
作为一名研究牲一定要了解pytorch和tensorflow。下面我来介绍一下。
TensorFlow和PyTorch是两个流行的开源机器学习库它们都支持深度学习模型的开发和训练。尽管它们在很多方面有相似之处但它们之间也存在一些关键的区别1. **设计哲学**- **TensorFlow**最初由Google Brain团队开发TensorFlow的设计更倾向于生产环境强调模型的可扩展性和部署的灵活性。TensorFlow提供了一个静态计算图这意味着在执行之前整个计算图需要被定义和优化。- **PyTorch**由Facebook的AI研究团队开发PyTorch的设计更倾向于研究和快速原型开发强调动态性和易用性。PyTorch使用动态计算图允许在运行时修改图。2. **易用性**- **TensorFlow**对于初学者来说可能稍微复杂一些因为它需要用户理解计算图的概念。- **PyTorch**提供了一个更接近于NumPy的API使得从NumPy过渡到深度学习更加自然。3. **灵活性**- **TensorFlow**由于其静态图的特性可能在某些需要高度灵活性的场景下不如PyTorch灵活。- **PyTorch**动态图使得在运行时修改模型变得更加容易这对于研究和快速迭代非常有用。4. **性能**- 两者在性能上都非常出色但TensorFlow在某些情况下可能因为其优化的静态图而提供更好的性能。5. **社区和生态系统**- **TensorFlow**由于其较早的发布和Google的支持拥有一个庞大的社区和丰富的库。- **PyTorch**虽然起步较晚但社区发展迅速特别是在研究领域。6. **部署**- **TensorFlow**提供了TensorFlow Serving等工具使得模型部署更加方便。- **PyTorch**模型部署可能需要更多的工作但PyTorch与ONNXOpen Neural Network Exchange的集成正在改善这一状况。7. **多GPU支持**- **TensorFlow**从设计之初就考虑了多GPU支持。- **PyTorch**虽然也支持多GPU但在某些情况下可能需要更多的手动配置。8. **API一致性**- **TensorFlow**API在不同版本之间可能发生变化这可能会影响向后兼容性。- **PyTorch**API相对稳定变化较少。选择哪个框架往往取决于个人偏好、项目需求和团队熟悉度。两者都是强大的工具能够支持复杂的深度学习任务。
二、我的环境 三、前期准备 1.设置GPU
import tensorflow as tf
gpus tf.config.list_physical_devices(GPU)if gpus:gpu0 gpus[0] #如果有多个GPU仅使用第0个GPUtf.config.experimental.set_memory_growth(gpu0, True) #设置GPU显存用量按需使用tf.config.set_visible_devices([gpu0],GPU)
2.导入数据 import tensorflow as tf
from tensorflow.keras import datasets, layers, models
import matplotlib.pyplot as plt# 导入mnist数据依次分别为训练集图片、训练集标签、测试集图片、测试集标签
(train_images, train_labels), (test_images, test_labels) datasets.mnist.load_data()
3.归一化
归一化与标准化https://blog.csdn.net/qq_38251616/article/details/126048261 # 将像素的值标准化至0到1的区间内。(对于灰度图片来说每个像素最大值是255每个像素最小值是0也就是直接除以255就可以完成归一化。)
train_images, test_images train_images / 255.0, test_images / 255.0
# 查看数据维数信息
train_images.shape,test_images.shape,train_labels.shape,test_labels.shape输出((60000, 28, 28), (10000, 28, 28), (60000,), (10000,))4.可视化图片
# 将数据集前20个图片数据可视化显示
# 进行图像大小为20宽、10长的绘图(单位为英寸inch)
plt.figure(figsize(20,10))
# 遍历MNIST数据集下标数值0~49
for i in range(20):# 将整个figure分成5行10列绘制第i1个子图。plt.subplot(2,10,i1)# 设置不显示x轴刻度plt.xticks([])# 设置不显示y轴刻度plt.yticks([])# 设置不显示子图网格线plt.grid(False)# 图像展示cmap为颜色图谱plt.cm.binary为matplotlib.cm中的色表plt.imshow(train_images[i], cmapplt.cm.binary)# 设置x轴标签显示为图片对应的数字plt.xlabel(train_labels[i])
# 显示图片
plt.show()
5.调整图片格式
#调整数据到我们需要的格式
train_images train_images.reshape((60000, 28, 28, 1))
test_images test_images.reshape((10000, 28, 28, 1))train_images.shape,test_images.shape,train_labels.shape,test_labels.shape输出((60000, 28, 28, 1), (10000, 28, 28, 1), (60000,), (10000,))四、构建简单的cnn网络
网络结构图 1第一步构建cnn网络模型
2第二步加载并打印模型
3第三步 输出结果编辑
# 创建并设置卷积神经网络
# 卷积层通过卷积操作对输入图像进行降维和特征抽取
# 池化层是一种非线性形式的下采样。主要用于特征降维压缩数据和参数的数量减小过拟合同时提高模型的鲁棒性。
# 全连接层在经过几个卷积和池化层之后神经网络中的高级推理通过全连接层来完成。
model models.Sequential([# 设置二维卷积层1设置32个3*3卷积核activation参数将激活函数设置为ReLu函数input_shape参数将图层的输入形状设置为(28, 28, 1)# ReLu函数作为激活励函数可以增强判定函数和整个神经网络的非线性特性而本身并不会改变卷积层# 相比其它函数来说ReLU函数更受青睐这是因为它可以将神经网络的训练速度提升数倍而并不会对模型的泛化准确度造成显著影响。layers.Conv2D(32, (3, 3), activationrelu, input_shape(28, 28, 1)),#池化层12*2采样layers.MaxPooling2D((2, 2)), # 设置二维卷积层2设置64个3*3卷积核activation参数将激活函数设置为ReLu函数layers.Conv2D(64, (3, 3), activationrelu), #池化层22*2采样layers.MaxPooling2D((2, 2)), layers.Flatten(), #Flatten层连接卷积层与全连接层layers.Dense(64, activationrelu), #全连接层特征进一步提取64为输出空间的维数activation参数将激活函数设置为ReLu函数layers.Dense(10) #输出层输出预期结果10为输出空间的维数
])
# 打印网络结构
model.summary() 五.编译模型 这里设置优化器、损失函数以及metrics
这三者具体介绍可参考我的博客
https://blog.csdn.net/qq_38251616/category_10258234.html# model.compile()方法用于在配置训练方法时告知训练时用的优化器、损失函数和准确率评测标准
model.compile(# 设置优化器为Adam优化器optimizeradam,# 设置损失函数为交叉熵损失函数tf.keras.losses.SparseCategoricalCrossentropy()# from_logits为True时会将y_pred转化为概率用softmax否则不进行转换通常情况下用True结果更稳定losstf.keras.losses.SparseCategoricalCrossentropy(from_logitsTrue),# 设置性能指标列表将在模型训练时监控列表中的指标metrics[accuracy]) # model.compile()方法用于在配置训练方法时告知训练时用的优化器、损失函数和准确率评测标准
六、训练模型 这里设置输入训练数据集图片及标签、验证数据集图片及标签以及迭代次数epochs
关于model.fit()函数的具体介绍可参考我的博客
https://blog.csdn.net/qq_38251616/category_10258234.htmlhistory model.fit(# 输入训练集图片train_images, # 输入训练集标签train_labels, # 设置10个epoch每一个epoch都将会把所有的数据输入模型完成一次训练。epochs10, # 设置验证集validation_data(test_images, test_labels)) 七预测
通过下面的网络结构我们可以简单理解为输入一张图片将会得到一组数这组代表这张图片上的数字为0~9中每一个数字的几率并非概率out数字越大可能性越大仅此而已 在这一步中部分同学会因为 matplotlib 版本原因报 Invalid shape (28, 28, 1) for image data 的错误提示可以将代码改为 plt.imshow(test_images[1].reshape(28,28)) 。
plt.imshow(test_images[1]) #输出测试集中第一张图片的预测结果
pre model.predict(test_images) # 对所有测试图片进行预测
pre[1] # 输出第一张图片的预测结果 八、知识点详解
本文使用的是最简单的CNN模型- -LeNet-5如果是第一次接触深度学习的话可以先试着把代码跑通然后再尝试去理解其中的代码。
1. MNIST手写数字数据集介绍
MNIST手写数字数据集来源于是美国国家标准与技术研究所是著名的公开数据集之一。数据集中的数字图片是由250个不同职业的人纯手写绘制数据集获取的网址为MNIST handwritten digit database, Yann LeCun, Corinna Cortes and Chris Burges下载后需解压。我们一般会采用(train_images, train_labels), (test_images, test_labels) datasets.mnist.load_data()这行代码直接调用这样就比较简单
MNIST手写数字数据集中包含了70000张图片其中60000张为训练数据10000为测试数据70000张图片均是28*28数据集样本如下 如果我们把每一张图片中的像素转换为向量则得到长度为28*28784的向量。因此我们可以把训练集看成是一个[60000,784]的张量第一个维度表示图片的索引第二个维度表示每张图片中的像素点。而图片里的每个像素点的值介于0-1之间。 2. 神经网络程序说明 3.模型结构说明 各层的作用
输入层用于将数据输入到训练网络
卷积层使用卷积核提取图片特征
池化层进行下采样用更高层的抽象表示图像特征
Flatten层将多维的输入一维化常用在卷积层到全连接层的过渡
全连接层起到“特征提取器”的作用
输出层输出结果
八、总结
本周的任务中实现了手写数字识别的任务第一点就是准备数据集本次数据集是可以直接下载的不用导入构建模型使用的是最基础的- -LeNet-5卷积层提取特征池化层降采样重复两遍之后来个flatten层拉伸一下便于全连接层输入全连接层得出分类结果。优化器损失函数直接放在# model.compile()方法用于在配置训练方法时告知训练时用的优化器、损失函数和准确率评测标准#方法里面了最后直接训练即可。整体比较顺利。