CS231Training Net

单个神经元

1. Sigmoid:
    1. 饱和使梯度消失--初始化权重选择难
    2. 输出非零中心--影响梯度下降
2. Tanh
3. ReLU(主要利用)(max(0,x))
    1. 容易死亡
4.Leak ReLU
5. Maxout

神经网络结构

1. 层组织
    1. 不能循环
    2. 分层,最普通的为全连接层(fully-connected         layer)--与其前后两层是完全成对连接的,但是同一个全连接层内的神经元之间没有连接
    3. 命名规则:当我们说N层神经网络的时候,我们没有把输入层算入。
    4. 输出层无激活函数
    5.      E. 网络尺寸:神经元个数与参数个数(输入层不算) Net1:6个神经元,26个参数
    6.      F. 权重矩阵:以网络1为例,对第一层W1为[该层神经元个数4,上层神经元个数3] 当上层给出的输入为x[3,1]时,输出就直接为np.dot(W1,x)
2. 表达能力
    1.  有证明:
    给出任意连续函数f(x)和任意ε>0均存在一个至少含1个隐层的神经网络g(x)(并且网络中有合理选择的非线性激活函数,比如sigmoid),对于∀x,使得$|f(x)-g(x)| < ε$
    换句话说,神经网络可以近似任何连续函数。

但神经网络,特别是卷积神经网络,层的深度很重要(一种解释是图像拥有层次化结构)
3. 设置层的数量与尺寸
1. 防止过拟合,L2正则化,dropout,输入噪声等方法,比减少神经元数量要好得多

设置数据和模型

1. 数据预处理
    1.  均值减法(Mean subtraction)数据中每个独立特征减去平均值.X -=np.mean(X,axis=0) 或 X -= np.mean(X)
    2. 归一化(Normalization):只有在确信不同的输入特征有不同的输入范围时才有意义
        1.  做零中心化(zero-centered)再每个维度除其标准差 X /= np.std(X,axis=0)
        2. 对每个维度做归一化,是的每个维度的最大值和最小值为1和-1
        3. 图像由于在[0:255]之间,所有并不是很必
    3. PCA与白化(Whitening)
2. 权重初始化
    1. 小随机数初始化: `W= 0.01*np.random.radn(D,H)//返回D*H大小矩阵,元素为均值为0,方差为1的标准高斯分布` 
    2. 使用`1/sqrt(n)`校准方差: 小随机数初始化随着输入数据增长,随机初始化后输出分布中方差也增大,根据输入数据量的平方根来调整其数值范围即`W = np.random.randn(n)/sqrt(n)`
    代码为`w = np.random.randn(n) * sqrt(2.0/n)`。这个形式是神经网络算法使用ReLU神经元时的当前最佳推荐。
    3. 稀疏初始化(Sparse initialization)另一个处理非标定方差的方法是将所有权重矩阵设为0,但是为了打破对称性,每个神经元都同下一层固定数目的神经元随机连接(其权重数值由一个小的高斯分布生成)。一个比较典型的连接数目是10个。
    4. 偏置(biases)的初始化。通常将偏置初始化为0,这是因为随机小数值权重矩阵已经打破了对称性。对于ReLU非线性激活函数,有研究人员喜欢使用如0.01这样的小数值常量作为所有偏置的初始值,这是因为他们认为这样做能让所有的ReLU单元一开始就激活,这样就能保存并传播一些梯度。然而,这样做是不是总是能提高算法性能并不清楚(有时候实验结果反而显示性能更差),所以通常还是使用0来初始化偏置参数。
    5. 批量归一化(Batch Normalization)。[批量归一化](https://arxiv.org/abs/1502.03167)是loffe和Szegedy最近才提出的方法,该方法减轻了如何合理初始化神经网络这个棘手问题带来的头痛:),其做法是让激活数据在训练开始前通过一个网络,网络处理数据使其服从标准高斯分布。因为归一化是一个简单可求导的操作,所以上述思路是可行的。在实现层面,应用这个技巧通常意味着全连接层(或者是卷积层,后续会讲)与激活函数之间添加一个BatchNorm层。在实践中,使用了批量归一化的网络对于不好的初始值有更强的鲁棒性。最后一句话总结:批量归一化可以理解为在网络的每一层之前都做预处理,只是这种操作以另一种方式与网络集成在了一起。
3. 正则化 Regularization
    1. L2正则:损失函数加上$\frac{1}{2}\lambda w^2 $.L2正则化可以直观理解为它对于大数值的权重向量进行严厉惩罚,倾向于更加分散的权重向量.使网络更倾向于使用所有输入特征,而不是严重依赖输入特征中某些小部分特征。最后需要注意在梯度下降和参数更新的时候,使用L2正则化意味着所有的权重都以$W += -\lambda * W$向着0线性下降。
    2. L1正则化:损失函数加上$\lambda |w $它会让权重向量在最优化的过程中变得稀疏(即非常接近0)。也就是说,使用L1正则化的神经元最后使用的是它们最重要的输入数据的稀疏子集.如果不是特别关注某些明确的特征选择,一般说来L2正则化都会比L1正则化效果好。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这是一个用于CS-Net训练的Python脚本模板,包含了一些基本的训练步骤和参数设置: ```python import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import DataLoader from dataset import CustomDataset from model import CSNet # 设置训练参数 epochs = 100 batch_size = 32 learning_rate = 0.001 # 构建模型和优化器 model = CSNet() optimizer = optim.Adam(model.parameters(), lr=learning_rate) # 加载训练数据 train_dataset = CustomDataset(train=True) train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True) # 加载验证数据 val_dataset = CustomDataset(train=False) val_loader = DataLoader(val_dataset, batch_size=batch_size, shuffle=False) # 定义损失函数 criterion = nn.MSELoss() # 开始训练 for epoch in range(epochs): model.train() # 将模型设置为训练模式 train_loss = 0.0 for i, data in enumerate(train_loader): # 将数据传入模型进行训练 inputs, labels = data optimizer.zero_grad() outputs = model(inputs) loss = criterion(outputs, labels) loss.backward() optimizer.step() # 计算训练损失 train_loss += loss.item() * inputs.size(0) # 在验证集上计算损失 model.eval() # 将模型设置为评估模式 val_loss = 0.0 with torch.no_grad(): for i, data in enumerate(val_loader): inputs, labels = data outputs = model(inputs) loss = criterion(outputs, labels) val_loss += loss.item() * inputs.size(0) # 输出训练和验证损失 train_loss /= len(train_dataset) val_loss /= len(val_dataset) print("Epoch: {}, Train Loss: {:.6f}, Val Loss: {:.6f}".format(epoch+1, train_loss, val_loss)) # 保存模型 torch.save(model.state_dict(), "csnet.pth") ``` 在这个脚本中,我们首先设置了训练参数(例如训练轮数、批次大小、学习率等),然后构建了CS-Net模型和Adam优化器。接着,我们加载了训练和验证数据集,并定义了损失函数。在训练过程中,我们使用`DataLoader`迭代训练数据,将数据传入模型进行训练,并计算训练损失。在每个epoch结束后,我们使用验证数据集计算验证损失,并输出训练和验证损失。最后,我们保存了训练好的模型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值