5-2学习记录|5-3日
1.simpletransformer包apex
它这个包默认的是如果使用GPU的话就是fp16精度,所以需要安装apex包,还没有尝试过,既然它这么写肯定是考虑到显卡内存大小,
https://github.com/NVIDIA/apex#quick-start,这个给出了步骤
$ git clone https://github.com/NVIDIA/apex $ cd apex $ pip install -v --no-cache-dir --global-option="--cpp_ext" --global-option="--cuda_ext" ./
ok没问题,可以安装成功。
但:cannot import name 'amp' from 'apex' (unknown location)
https://github.com/NVIDIA/apex/issues/621,给出的办法是:https://github.com/NVIDIA/apex/issues/86#issuecomment-455620478
pip uninstall apex cd apex rm -rf build (if it exists) python setup.py install --cuda_ext --cpp_ext
出现了这个问题:
FileNotFoundError: [Errno 2] No such file or directory: ':/usr/local/cuda/bin/nvcc': ':/usr/local/cuda/bin/nvcc'
又尝试chmod 777 nvcc,还是一样的问题,说明不是权限的问题。那可能的问题就是软链接,cuda默认会链接到cuda-10.0这个目录下。
搜到了相同的问题,解答https://github.com/NVIDIA/apex/issues/368#issuecomment-507533209,非常ok!
就:
export CUDA_HOME=/usr/local/cuda
而且我进入py环境:
就导入进来没问题?但是version就没有这个属性,而且我pip list 也根本就找不到apex这个包安装过啊。
安装过程好复杂,好慢卡住了吗。
以上均没有问题了。
2.torch手动梯度手动清零
https://www.zhihu.com/question/303070254?sort=created
这个和参数gradient_accumulation_steps一起来理解
使用梯度累加,可以让梯度计算过程实现更多的可能性:
for i,(images,target) in enumerate(train_loader): # 1. input output images = images.cuda(non_blocking=True) target = torch.from_numpy(np.array(target)).float().cuda(non_blocking=True) outputs = model(images) loss = criterion(outputs,target) # 2.1 loss regularization loss = loss/accumulation_steps # 2.2 back propagation loss.backward() # 3. update parameters of net if((i+1)%accumulation_steps)==0: # optimizer the net optimizer.step() # update parameters of net optimizer.zero_grad() # reset gradient
反正使用梯度累加可以变相增加bs,缓解贫穷。
主要是因为torch会对梯度进行累加,所以需要清零!
在前向的时候会计算梯度,这样就需要内存空间来保存,在loss.backward()之后这整个占用的空间就会被释放
对于大bs,在计算梯度相关信息的时候需要的内存空间就大;所以可以选择小bs,和梯度累加来变相实现大bs。
5-3日————————
1.合并dict
https://blog.csdn.net/Jerry_1126/article/details/73017270
字典是Python语言中唯一的映射类型。
映射类型对象里哈希值(键,key)和指向的对象(值,value)是一对多的的关系,通常被认为是可变的哈希表。
使用items()更新,在python2中实现。
update,这个应该比较常用的:
2.什么是线性分类器/非线性分类器?
看到一篇论文中说,逻辑回归和SVM都是线性分类器
https://www.cnblogs.com/BlueBlueSea/p/10291443.html
上面这个链接里总结的回答已经很全面了,就已经过转换之后,逻辑回归的决策边界是线性的边界,
https://www.zhihu.com/question/30633734,这个回答下面。
关键点是:如果模型是参数的线性函数,并且存在线性分类面,那么就是线性分类器,否则不是。
总结一下:对于二分类,线性分类只用一个超平面将其分开,但可能是引入到了更高维的空间;而非线性分类器是曲面,多个超平面的组和。
5-4日周一————
1.sklearn 交叉验证cross_val_score
https://blog.csdn.net/qq_36523839/article/details/80707678
from sklearn import datasets #自带数据集 from sklearn.model_selection import train_test_split,cross_val_score #划分数据 交叉验证 from sklearn.neighbors import KNeighborsClassifier #一个简单的模型,只有K一个参数,类似K-means import matplotlib.pyplot as plt iris = datasets.load_iris() #加载sklearn自带的数据集 X = iris.data #这是数据 y = iris.target #这是每个数据所对应的标签 train_X,test_X,train_y,test_y = train_test_split(X,y,test_size=1/3,random_state=3) #这里划分数据以1/3的来划分 训练集训练结果 测试集测试结果 k_range = range(1,31) cv_scores = [] #用来放每个模型的结果值 for n in k_range:#这个for循环是用来测试聚类成几类效果比较好的 knn = KNeighborsClassifier(n) #knn模型,这里一个超参数可以做预测,当多个超参数时需要使用另一种方法GridSearchCV scores = cross_val_score(knn,train_X,train_y,cv=10,scoring='accuracy') #cv:选择每次测试折数 accuracy:评价指标是准确度,可以省略使用默认值,具体使用参考下面。 cv_scores.append(scores.mean()) plt.plot(k_range,cv_scores) plt.xlabel('K') plt.ylabel('Accuracy') #通过图像选择最好的参数 plt.show() best_knn = KNeighborsClassifier(n_neighbors=3) # 选择最优的K=3传入模型 best_knn.fit(train_X,train_y) #训练模型 print(best_knn.score(test_X,test_y)) #看看评分
可以看到cross_val_score的参数,第一个参数是estimator,
estimator:estimator object implementing ‘fit’
The object to use to fit the data.
应该就是sklearn中实现的那些模型,比如linear_model等,带有fit方法的。
其他的参数还有数据集,交叉验证次数等。
2.sklearn的pipeline和FeatureUnion
https://blog.csdn.net/qq_35992440/article/details/89918305
我觉得这个就是流水线性太强,机动性就比较弱,对于nlp类型的文本数据可能就适应度比较低
3.sklearn使用总结
https://www.jianshu.com/p/516f009c0875,