提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
深度学习(DL, Deep Learning)是机器学习(ML, Machine Learning)领域中一个新的研究方向,它被引入机器学习使其更接近于最初的目标——人工智能(AI, Artificial Intelligence)。最近也是接触到了这方面,简单地总结一下我在这一阶段遇到的一些问题和学习的内容。
刚下载完anaconda打开后会显示loading application,然后一点击就会消失。我也查了许多的解决办法,说一下我解决这个的一个方法。
在Anaconda的文件夹里依次找到如下文件:
D:\Anaconda\Lib\site-packages\anaconda_navigator\api
(我是装在D盘的,所以开头是D)
找到anaconda_api文件,然后打开,点击搜索,找到如下代码
versions=[vsdata.get(‘productVersion’)],修改成 versions=[“1b8e8302e405050205e69b59abb3559592bb9e60”],
我开始的时候使用官网下载,结果下载失败,被墙了,像这种HTTPError基本都是这种情况,然后我换了清华镜像,清华镜像也是比较快的.
打开anaconda prompt,activate一个环境输入,添加镜像网站:
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
conda config --set show_channel_urls yes
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/
然后在c盘的C:\Users\user可以找到.condarc文件。打开文件
将-default删除保存。复制command放入anaconda的对应环境中,不复制-c pytorch。不加这个才是镜像下载。
最后print一下看下安装是否成功:
import torch
print(torch.cuda.is_available())
print(torch.__version__)
print(torch.version.cuda)
目前有许多的图像处理库,常见的有opencv, matplotlib, visdom。opencv和matplotlib是比较常用的图像分析模块。在python里面,opencv不能直接显示出来,所以有些时候会借助matplotlib来显示。
import matplotlib.pyplot as plt
import numpy as np
from PIL import Image
img = Image.open('lena.png') # 读取的图像显示的
img.show()
img.format
region = img.transpose(Image.ROTATE_180) #翻转
out = img.resize((128, 128)) # 改变大小
out1 = img.rotate(45) #旋转
plt.imshow(img) # 显示
mean=np.array([104., 117., 124.]) #均值
np.shape(img)
img1 -= mean
plt.imshow(img1)
import matplotlib.pyplot as plt
import cv2
img = cv2.imread('01.jpg',cv2.IMREAD_COLOR)
%matplotlib inline
plt.subplot(111)
plt.imshow(img)
在PyTorch中,torch.Tensor是存储和变换数据的主要工具。Tensor和NumPy的多维数组非常类似。然而,Tensor提供GPU计算和自动求梯度等更多功能,这些使Tensor更加适合深度学习。
"tensor"这个单词一般可译作“张量”,张量可以看作是一个多维数组。标量可以看作是0维张量,向量可以看作1维张量,矩阵可以看作是二维张量。
Numpy提供了两种基本的对象:ndarray和ufunc。ndarray是存储单一数据类型的多维数组,而ufunc则是能够对数组进行处理的函数。
用pytorch写神经网络主要分为四个步骤:1、准备数据集。主要使用的工具类是dataset和dataloader,一般情况下使用的处理方法是mini-batch,将读取的数据进行分批处理;2、设计模型。选择一个线性函数和激活函数,用来设计模型。激活函数对输入信息进行非线性变换。然后将变换后的输出信息作为输入信息传给下一层神经元;3、构造损失函数和优化器。常见的损失函数有MSE、BCE和CE,BCELoss返回的是损失的平均值,即计算完之后要除以点数,BCE可以处理多分类问题。CE是对每一个样本的网络输出先做softmax处理,然后所有数值取log,然后将标签对应位置的值加起来,再对样本数量做平均。MSE指的就是模型预测值f(x)与样本真实值y之间距离平方的平均值,MSE曲线的特点是光滑连续、可导,便于使用梯度下降算法,是比较常用的一种损失函数而且MSE 随着误差的减小,梯度也在减小,这有利于函数的收敛,即使固定学习因子函数也能较快取得最小值; 4、完成训练周期。一个周期主要包括前馈、反馈以及权重的更新。
pytorch的可视化工具主要是visdom和tensorboard。pytorch Visdom可视化,是一个灵活的工具,用于创建,组织和共享实时丰富数据的可视化,支持Torch和Numpy。也可以使用 mplot3d工具包生成3D图。
激活函数经常使用Sigmoid函数、tanh函数、ReLu函数。
Sigmoid函数的优点在于输出范围有限,数据在传递的过程中不容易发散,并且其输出范围为(0,1),可以在输出层表示概率值,如图所示。Sigmoid函数的导数是非零的,很容易计算。Sigmoid函数的主要缺点是梯度下降非常明显,且两头过于平坦,容易出现梯度消失的情况,输出的值域不对称,并非像tanh函数那样值域是-1到1。
双曲正切函数将数据映射到[-1,1],解决了Sigmoid函数输出值域不对称问题。另外,它是完全可微分和反对称的,对称中心在原点。然而它的输出值域两头依旧过于平坦,梯度消失问题仍然存在。为了解决学习缓慢和梯度消失问题,可使用其更加平缓的变体,如log-log、Softsign、Symmetrical Sigmoid等。
ReLU函数是目前神经网络里常用的激活函数,由于ReLU函数是线性特点使其收敛速度比Sigmoid、Tanh更快,而且没有梯度饱和的情况出现。计算更加高效,相比于Sigmoid、Tanh函数,只需要一个阈值就可以得到激活值,不需要对输入归一化来防止达到饱和。
学习率其实就是误差下降(梯度下降)时,函数旋转的角度,它控制每次更新参数的幅度,过高和过低的学习率都可能对模型结果带来不良影响,合适的学习率可以加快模型的训练速度。过高的话,可能会使得模型的训练忽略了细节,从而不能达到误差的最小值,过低的话,会使得整个训练的过程变得异常慢。
这个概念过拟合是指模型在训练集上预测效果好,但在测试集上预测效果差。而欠拟合则是训练集和效果差,但泛化能力不错。
常用的防止过拟合的方法有:1、提前停止;2、使用更多数据进行训练;3、特征选择;4、交叉验证;5、数据增强;6、正则化;