##韩文车牌项目学习
- 韩文车牌项目调试进展·周一
运行时候遇到一个错误:ImportError: libcublas.so.9.0: cannot open shared object file: No such file or directory
解决方法:sudo ldconfig /usr/local/cuda-9.0/lib64
ldconfig通常在系统启动时运行,而当用户安装了一个新的动态链接库时,就需要手工运行这个命令.
扩展:linux命令解析:ldconfig命令的用途,主要是在默认搜寻目录(/lib和/usr/lib)以及动态库配置文件/etc/ld.so.conf内所列的目录下,搜索出可共享的动态链接库(格式如前介绍,lib*.so*),进而创建出动态装入程序(ld.so)所需的连接和缓存文件.缓存文件默认为/etc/ld.so.cache,此文件保存已排好序的动态链接库名字列表。
- 韩文车牌项目调试进展·周二
数据集做好(2w条),项目可以跑了,训练了一版参数,预测时候发现正确率为0。查原因…,…
- 命令行模块解析
import argparse
#使用argparse的第一步是创建ArgumentParser对象
parser = argparse.ArgumentParser(description='Process some integers.')
#调用parse.args()将返回一个对象,它具有两个属性:integers和accumulate,前者是一个整数集合,
#后者根据命令行参数的不同,代表不同的函数,可以是max(),也可以是sum()。
parser.add_argument('integers', metavar='N', type=int, nargs='+',
help='an integer for the accumulator')
parser.add_argument('--sum', dest='accumulate', action='store_const',
const=sum, default=max,
help='sum the integers (default: find the max)')
#通过调用parse_args()来解析ArgumentParser对象中保存的命令行参数:将命令行参数解析成相应的数据类型并采取相应的动作,它返回一个Namespace对象。
args = parser.parse_args()
print(args.accumulate(args.integers))
- 源码中Batch Normalization()函数解析
题记:Model中一层cnn的大体结构,Con2D+BatchNormalization+Activation+MaxPooling2D
BN对数据进行归一化,使其均值变为0,方差变为1。很好地解决了梯度消失问题!12 ①! ,将输出从饱和区拉倒了非饱和区(导数),很好的解决了梯度消失问题。
神经网络学习过程本质上就是为了学习数据分布,如果训练数据与测试数据的分布不同,网络的泛化能力就会严重降低。对于relu,因为会有一半的置零。BN后可能会削弱网络的性能,但必须要保证数据的分布。
!12 ①! 如果没有BN,使用Sigmoid激活函数会有严重的梯度消失问题。但有时候会需要一些梯度消失和爆炸的情况,所以会把标准化的参数再往回拉一点[不明白]。
- 模型参数初始化目的
如果所有的参数都是0,那么所有神经元的输出都将是相同的(back propagation,gradient,weight update相同)。同一层内所有神经元的行为也是相同的
Batch Normalization和he_normal比较,前者用于数据归一,后者用于网络层初始化。
- RNN和LSTM理解
RNN_CELL的源码
# compute next activation state using the formula given above
a_next =np.tanh(np.dot(Waa,a_prev)+np.dot(parameters["Wax"],xt)+ba)
# compute output of the current cell using the formula given above
yt_pred = softmax(np.dot(Wya,a_next)+by)
LSTM_CELL图
注:对于a的理解(中间的传递值)可以参考RNN CELL结构。
n_x, m = xt.shape
n_y, n_a = Wy.shape
# Concatenate a_prev and xt
#调整shape存放xt输入和权重Wy
concat = np.zeros((n_a + n_x, m))
concat[: n_a, :] = a_prev
concat[n_a :, :] = xt
# Compute values for ft, it, cct, c_next, ot, a_next using the
# formulas given in figure
ft = sigmoid(np.dot(Wf, concat) + bf)
it = sigmoid(np.dot(Wi, concat) + bi)
cct = np.tanh(np.dot(Wc, concat) + bc)
c_next = ft * c_prev + it * cct
ot = sigmoid(np.dot(Wo, concat) + bo)
a_next = ot * np.tanh(c_next)
# Compute prediction of the LSTM cell
yt_pred = softmax(np.dot(Wy, a_next) + by)
- 韩文车牌项目调试进展·周三
预热的知识
- EarlyStopping函数
题记:模型训练总有结束的点。防止过拟合的方法:dropout,L2正则化,这里用EarlyStopping。
为了获得性能良好的神经网络,网络定型过程中需要进行许多关于所用设置(超参数)的决策。超参数之一是定型周期(epoch)的数量:亦即应当完整遍历数据集多少次(一次为一个epoch)。如果epoch数量太少,网络有可能发生欠拟合(即对于定型数据的学习不够充分);如果epoch数量太多,则有可能发生过拟合(即网络对定型数据中的“噪声”(离群点)而非信号拟合)。
EarlyStopping旨在解决epoch数量需要手动设置的问题。它也可以被视为一种能够避免网络发生过拟合的正则化方法(与L1/L2权重衰减和丢弃法类似)。
原理:
1.将数据分为训练集和验证集
2.每个epoch结束后(或每N个epoch后): 在验证集上获取测试结果,随着epoch的增加,如果在验证集上发现测试误差上升,则停止训练;
4.将停止之后的权重作为网络的最终参数。
补充:
如果不用early stopping降低过拟合,另一种方法就是L2正则化,但需尝试L2许多不同的λ值。
参考博客
- epoch/batchsize/iteration
batchsize:批大小。每次在训练集中取batchsize个样本训练;
iteration:1个iteration等于使用batchsize个样本训练一次;
epoch:1个epoch等于使用训练集中的全部样本训练一次;
举个例子,有2000个数据,分成4个batch,那么batch size就是500。运行所有的数据进行训练,完成1个epoch,需要进行4次iterations。
- epoch和validation_loss,loss的关系
题记:**问我epoch的知识点,上文介绍了epoch的知识,延伸一点,epoch不是越高越好,如何找到合适的epoch。
右边2个loss的图,在第15个epoch之前,训练集上的loss不断降低,验证集上的val-loss也在不断减小,这说明模型在不断拟合数据。但是在第15个epoch之后,训练集上的loss仍然在不断降低,而验证集上的val-loss开始不断增加,这是典型的过拟合问题。
假设现在有个类别的数据集,类别分别是dog和horse,对于现在的一个样本,其真实类别是horse,也就是其真实值one-hot为[0, 1],对于下面2种情况:
①其预测softmax值为[0.1, 0.9],则对于这个例子的交叉熵值计算为:−(0∗ln0.1+1∗ln0.9)≈0.105
②其预测softmax值为[0.4, 0.6],则对于这个例子的交叉熵值计算为:−(0∗ln0.4+1∗ln0.6)≈0.511
也就是说,虽然在上述两种情况下,预测值都为horse,即其accuracy是一样的,但是其loss是增加的。这种情况下就会出现val-loss不断增加,但是val-accuracy平稳不变的情况。
参考博客
- 项目调试结果
||~epoch_num || ACC ||letter_ACC ||
|| 44 || 0.8975 || 0.97978 ||
|| 83 || 0.9204 || 0.98458 ||
||90 || 0.9176 || 0.98438 ||
||94 || 0.9219 || 0.98442 ||
||batch_size:256,epoch :100。photo_num:18w||