深度学习(二)

一、常用的非线性激励函数
1.Sigmoid
优点:输出可以映射到[0,1]
缺点:一次求导后梯度损失了75%,梯度损失严重

2.Than
优点:输出可以映射到[-1,1]
缺点:梯度损失明显

3.Relu
特性:正向截断负值,损失大量特征,但由于特征数量足够,仍然足够推动机器进行学习
 
    通过引入非线性层使得神经网络能够拟合非线性问题。
 
【问题】是否存在线性回归网络?
答:没有,存粹的线性问题并不存在多层网络的概念,由其线性特性,只需要一层便能表示“多层”的
 
 
 
二、神经网络构建
 
1、神经元的并联和串联
 
 
 
 
 从第一层神经元的最后一层的神经元,每一个神经元的数值由前一层神经元数值,神经元参数W,b以及激励函数共同决定。
 
2.神经网络优化:链式法则
  计算梯度
Output->last layer  
Layer->layer
Layer->parameter
 
 
3.训练过程中调参技巧
刚开始适用较大的学习率,加快收敛,后期使得学习率衰减,提高训练精度。
 
 
 
三、神经网络的“配件”
1.常见的损失函数
         影响深度学习性能的最重要参数之一,是外部世界(标签)对神经网络模型训练的直接指导,合适的损失函数能确保深度学习模型收敛,设计合理的损失函数是研究工作中主要内容之一
 
1.1Sofmax
           
例:一组数据【1,2,3,4,1,2,3】----》【0.024,0.064,0.175,0.475,0.024,0.064,0.175】
对Loss的影响:指数型的性质将放大数据间的区别,因此对于分类问题的预测结果更为清晰
 
1.2Cross entropy(交叉熵)
    
缺点:当Yn=0时,会造成损失无限大。
用途:目标为[0,1]区间的回归问题以及生成问题(如针对一张图片的生成问题,刚开始生成0到1间的回归值,之后再乘以255得到像素级彩色图片)单独将某些预测值取出或者赋予不同大小的参数
 
1.3损失函数设计
1.3.1看中某一个属性
1.3.2合并多个loss:多目标训练任务,设置合理的Loss结合方式(如FAST-RCNN中融合两个Loss(分类与空间位置的回归))
1.3.3神经网络融合:不同神经网络loss结合,共同loss对网络进行训练指导
 
 
2.学习率
1.性质:学习率大时候收敛快,学习率小时精度高
2.学习率的选择: 固定,步进
    
 
3.惯性因子
对新出现的梯度方向,优化方向会沿着之前已经得到的优化方向前进,不会直接变为新方向,只会微调
 
4.过拟合
过度关注训练数据,从模型上的体现便是过于关注某些神经元,权重过高,导致模型灵活性下降,下图中黑色曲线比绿色更高
 
4.1应对方法:
4.1.1正则化,在考虑损失函数的设计时,同时考虑模型,得到模型较小请款下的最优决策函数
4.1.2Dropout:对隐藏层中的神经元训练过程中进行随机丢弃,这样训练得到的结果各神经元参数分布将比较均匀,不容易过拟合
4.1.3Fine-tuning:利用已经训练好的模型,对其中某些层参数固定,训练一小部分参数,对整个网络进行微调,示例如下
 
 
4.2面试题Dropout ,Pooling区别?
Pooling的本质是降维(降维的原因是经过ReLU后,很多数据值为0,不对训练有效果,因此通过最大/平均降维进行抛弃)
Dropout本质是:正则化
下面是两个串联神经网络训练的代码示例,一个是基于PyTorch实现的,另一个是基于Keras实现的: PyTorch代码: ```python import torch import torch.nn as nn import torch.optim as optim # 定义第一个神经网络 class Net1(nn.Module): def __init__(self): super(Net1, self).__init__() self.fc1 = nn.Linear(10, 20) self.fc2 = nn.Linear(20, 10) def forward(self, x): x = self.fc1(x) x = nn.functional.relu(x) x = self.fc2(x) return x # 定义第神经网络 class Net2(nn.Module): def __init__(self): super(Net2, self).__init__() self.fc1 = nn.Linear(10, 20) self.fc2 = nn.Linear(20, 5) def forward(self, x): x = self.fc1(x) x = nn.functional.relu(x) x = self.fc2(x) return x # 定义串联神经网络 class ConcatNet(nn.Module): def __init__(self): super(ConcatNet, self).__init__() self.net1 = Net1() self.net2 = Net2() def forward(self, x): x = self.net1(x) x = self.net2(x) return x # 训练串联神经网络 net = ConcatNet() criterion = nn.MSELoss() optimizer = optim.SGD(net.parameters(), lr=0.01) for epoch in range(100): # 生成训练数据 inputs = torch.randn(100, 10) labels = torch.randn(100, 5) # 前向传播 outputs = net(inputs) # 计算损失 loss = criterion(outputs, labels) # 反向传播 optimizer.zero_grad() loss.backward() optimizer.step() print('Epoch [%d/%d], Loss: %.4f' % (epoch+1, 100, loss.item())) ``` Keras代码: ```python import numpy as np from keras.models import Sequential from keras.layers import Dense # 定义第一个神经网络 model1 = Sequential() model1.add(Dense(units=20, activation='relu', input_dim=10)) model1.add(Dense(units=10, activation='relu')) # 定义第神经网络 model2 = Sequential() model2.add(Dense(units=20, activation='relu', input_dim=10)) model2.add(Dense(units=5, activation='relu')) # 定义串联神经网络 model = Sequential() model.add(model1) model.add(model2) # 编译模型 model.compile(loss='mse', optimizer='sgd') # 训练模型 for epoch in range(100): # 生成训练数据 inputs = np.random.randn(100, 10) labels = np.random.randn(100, 5) # 训练模型 loss = model.train_on_batch(inputs, labels) print('Epoch [%d/%d], Loss: %.4f' % (epoch+1, 100, loss)) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值