0%

操作系统为 CentOS Linux release 7.2,试过网上的一些方法例如软链接,增加graph路径都没有用,自己摸索找到了配置路径的位置,记录一下。

  1. 使用df -h 查看磁盘状况:
1
2
3
4
5
$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/vda1 99G 91G 3.4G 97% /
/dev/vdb1 493G 62G 406G 14% /data
overlay 99G 91G 3.4G 97% /var/lib/docker/overlay2/xxx

可以看到/var/lib/docker/放满了,可以移到data目录下。

同时可以先确认一下目前的 docker 目录:

1
2
3
4
$ docker info
...
Docker Root Dir: /var/lib/docker
...
  1. 清理无用的内容
1
$ docker system prune

可添加-a清除得更彻底。之后查看磁盘状况:

1
2
3
4
5
$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/vda1 99G 83G 12G 88% /
/dev/vdb1 493G 62G 406G 14% /data
overlay 99G 83G 12G 88% /var/lib/docker/overlay2/xxx

有所缓解,但12G依然不够用,需要更改 docker 目录到 /data下。

  1. 停止docker服务
1
$ systemctl stop docker
  1. 创建新的docker工作目录
1
$ mkdir -p /data/dockerlib
  1. 迁移/var/lib/docker
1
rsync -avz /var/lib/docker /data/dockerlib
  1. 改动配置文件
1
$ vim /etc/docker/daemon.json

在文件中更改

1
"data-root": "/data/dockerlib/docker",
  1. 重启docker服务
1
2
3
4
5
systemctl daemon-reload

systemctl restart docker

systemctl enable docker
  1. 确认是否配置成功
1
2
3
4
$ docker info
...
Docker Root Dir: /data/dockerlib/docker
...
  1. 确认 docker 已经成功转移

修改原 docker 路径名,再进行一些操作

1
2
3
$ mv /var/lib/docker /var/lib/docker_temp
$ docker image list
$ docker container list

在这一步我发现之前的 container 进去会有问题,但是重启后可以重新进入:

1
2
3
$ docker stop xxx
$ docker start xxx
$ docker exec -it xxx /bin/bash

确认无误后可以删除,为了防止出错可以用一阵子再删

1
$ rm -rf /var/lib/docker_temp

创建页面

参考资料:https://zhuanlan.zhihu.com/p/70240127

使用Hexo自建博客,Hexo会自动生成静态页面并部署到GitHub repo上,不需要直接git push。而在GitHub repo里也只会有public目录下的内容。与此同时public文件夹在hexo的目录下是在.gitignore里的,所以不要直接push整个目录,这样会导致网页404。

关于网站信息的修改在_config.yml进行,例如修改标题在Site下。

修改域名

主要步骤上面的资料已经很详细了,但关于这段

注:如果你用了 hexo clean 命令删除本地静态资源,CNAME文件也会被删掉,所以你可以在本地生成的public文件夹中直接创建好,再上传。

也许是typo,应该把CNAME文件放在source里,才不会被删。

安装主题

本站采用next主题:https://github.com/next-theme/hexo-theme-next

因为hexo是5.0+版本,所以安装主题只需:

1
2
$ cd hexo-site
$ npm install hexo-theme-next

再把_config.yml的theme改成next。但这种安装方法比较新,next的中文文档没有更新,需要参考英文文档进行定制:https://theme-next.js.org/docs/getting-started/configuration.html

以改scheme为例,如果按照上面的教程走,那就是npm安装的,运行:

1
$ cp node_modules/hexo-theme-next/_config.yml _config.next.yml

然后修改Schemes的部分即可。

https://github.com/anuragranj/coma

Tensorflow 1.3

这一步由于tensorflow1的环境非常难配置,使用现成docker,版本对应关系如下:

https://blog.csdn.net/qq_41936559/article/details/104226333

opendr安装

opendr安装对python3的支持比较麻烦,参考:

https://www.codenong.com/cs110955392/

MPI-IS / mesh配置

https://github.com/MPI-IS/mesh

经常要用到的mesh渲染工具

配置过程:

1
2
3
yum install boost-devel
BOOST_INCLUDE_DIRS=/usr/include/boost make all
make tests

遇到报错:
ImportError: No module named psbody.mesh.mesh
但是在python3下import是可以的,后来发现是在make tests时默认是python,而在docker环境下要改成python3,测试通过。

安装homebrew

https://www.jianshu.com/p/627b2d462151

1
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

安装ffmepg

1
brew install ffmpeg

安装rename

https://commandnotfound.cn/linux/1/461/rename-命令

1
brew install rename

批量改名

https://zhuanlan.zhihu.com/p/90829056

1
rename 's/.mp41/.mp4/' *

后来发现可以直接多选右键批量改名。

热插拔修复

https://www.zhihu.com/question/308406915
打开磁盘工具
打开terminal

1
2
3
diskutil list
ps aux | grep fsck
sudo pkill -f fsck

点急救,需要等很久很久

压缩解压分卷

压缩:

1
zip test.zip test.doc 

分卷:

1
zip -s 50m test.zip --out ziptest 

合卷:

1
cat ziptest.z* > test.zip 

解压:

1
unzip test.zip

昨天朋友推荐了vscode以后今天试了一下真的是一见钟情,之前学c++的时候就很喜欢用vs,现在用python而且又是在服务器上跑,一直觉得sublime调试非常不方便。vscode对于以前用习惯vs的人不要太舒服,而且对jupyter notebook的支持意外地好,可以说是综合了好几个我非常爱用的IDE的优点了!

在vscode中使用python

这个特别简单,一个官方的教程即可搞定:python-tutorial

几个注意的点:

  • 设置语言

按F1然后搜索“configure display language”,就可以选择和安装语言

  • 切换python 环境

左下角这里可以切换版本,非常方便

  • 安装包

根据tutorial提示,最好是在虚拟环境下安装包

1
2
3
4
py -3 -m venv .venv
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope Process
.venv\scripts\activate
python -m pip install matplotlib

用vscode远程工作

这也是我最关心的问题,毕竟我的代码几乎都是在服务器上跑的。

首先是官方教程:remote-overview,or more specifically:Remote Development using SSH

简单介绍一下,在vscode上用SSH远程工作的大致原理就是,本地vscode只提供UI,所有的工作区和代码之类的全是在远程进行的。但你用起来的体验就像是在本地调代码一样。

需要特别注意的一点是,python插件要在远程重新安装一次。

下载remote development

首先在extensions商店搜索“remote development”

连接remote machine

F1, Remote-SSH: Connect to Host…

这边我选择的是add SSH然后输入username@hostname ,之后弹出来的窗口上方会提示是否继续和输入密码,输入密码之后就会连上然后就可以打开文件夹。

免密登录

这个有点复杂,单独讲一下,官网见:Quick start: SSH key,同时参考了这篇文章:使用vscode进行远程炼丹

  1. 在local打开cmd,输入:
1
ssh-keygen -t rsa -b 4096

中途提示输入文件路径和密码,都直接回车。

  1. 上传公钥

这边我是直接在服务器新建了/.ssh/authorized_keys然后手动把id_rsa.pub里的内容复制进去。

接下来再连接就不需要输入密码了。

在远程中调试

首先就是把python插件再安装一次,然后重新连接,这时候会重新也安装一下pylint。

在vscode里用jupyter notebook

这个我之前想复杂了,其实直接新建一个.ipynb文件,打开并且运行,就会提示你没有装,然后你选择一下安装方式conda/pip就可以装好了。

连接本地的jupyter notebook

用不上,理论上同下

连接服务器上的jupyter notebook

意外也很容易,在想要的目录上jupyter notebook,出来的链接点进去就可以打开了
(之前的坑是用jupyter notebook list,结果出来的目录是home/yourname)


2020年6月12日更新
用上述方法做断连就打不开了,需要用

1
jupyter notebook --ip=0.0.0.0 --port=xxxx

然后在http://gpu-server-2:xxxx/?token=xxxx里把gpu-server-2换成服务器ip就可以了

断点调试是设置参数

可以参考这篇文章:
https://blog.csdn.net/u012332816/article/details/80801106

like this:

        "args": ["--config","../config_zach.yaml",
            "--path_config","../path_config_zach.yaml"]

切割音频

ffmpeg -i zhaoliying.mp3 -vn -acodec copy -ss 00:00:00 -t 00:00:10 zhaoliying_10s.mp3

切割视频

ffmpeg -i target_video.mp4 -vcodec copy -acodec copy -ss 00:00:00 -t 00:00:05 target_video_5s.mp4

用ffmpeg给视频批量加水印

提取音频

ffmpeg -i target_video_0829_1.mp4 -f mp3 -vn target_video_0829_1.mp3

改fps

ffmpeg -i “target_video_0829_1.mp4” -r 29.97 -b:v 10M “target_video_0829_1_fps2997.mp4”

拼接视频

ffmpeg -i input1.mp4 -i input2.mp4 -filter_complex hstack output.mp4

图片转视频

ffmpeg -f image2 -i %d.png -vcodec libx264 -r 29.97 -b:v 10M tt.mp4

旋转视频

ffmpeg -i input.mp4 -vf “transpose=1” output.mp4

拼接音频

sox 1.mp3 2.mp3 out.mp3

这边是发现ffmpeg拼不起来,然后用sox发现报错是image.png
所以要调整一下sample-rate和channels
ffmpeg -i 1.mp3 -ac 1 -ar 16000 out1.mp3

改音频为16K

ffmpeg -i 01.mp3 -acodec pcm_s16le -ac 1 -ar 16000 1.wav

改视频size

ffmpeg -i ziyi_C049_bg_4K.mp4 -vf scale=1920:1080 ziyi_C049_bg_1080p.mp4 -hide_banner

切割画面

ffmpeg -i input -vf crop=480:480:186:0 output

https://ask.csdn.net/questions/227737

加水印

ffmpeg -i audio_0_1s.avi -vf "movie=logo.png[watermark];[in][watermark] overlay=main_w-overlay_w-10:main_h-overlay_h-10[out] " output.avi

批量处理

参考:How to batch convert/multiplex any files with ffmpeg
改了一个脚本:

1
2
for %%a in ("*.*") do ffmpeg -i "%%a" -vf "movie=logo_L.png[watermark];[in][watermark] overlay=0:0[out] " "newfiles\%%~na.mp4"
pause

在terminal运行脚本

上面的链接用的是.bat,在linux需要用shell(shell学习指南)编写脚本。

在terminal运行.sh脚本

执行Shell脚本(多种方法)

首先新建一个文件test.sh,然后使用bash命令运行:
$ bash test.sh

运行command

在测试过程中得知command和script不太一样,用以下command成功了:
for vid in *.avi; do ffmpeg -i "$vid" -vf "movie=logo_L.png[watermark];[in][watermark] overlay=0:0[out] " "${vid%.*}_logo.avi"; done

舍弃本地修改

git 撤销,放弃本地修改

  1. 未add时
    git checkout .

  2. add后,commit前
    git reset HEAD .
    回到1,继续
    git checkout .

  3. commit后

    1
    2
    git log
    git reset --hard commitid

处理git push文件过大的办法

在进行git push的时候,遇到了报错HTTP 413 curl 22 The requested URL returned error: 413 Request Entity Too Large

我觉得可能是因为保存rnn模型的文件夹比较大,就在.gitignore加上了那个目录。(让.gitignore生效的办法:git 修改.gitignore后生效),然后再push还是不行,我不确定是不是因为之前commit的还在。

这个错误本身搜到的解决方案一般是提高文件传输限制之类的,但是我是希望之前的较大的那个commit不要被push上去。于是我搜到了一个解决方案是用git reset: git push 推送大文件失败的处理办法

也就是说,下次遇到类似的问题,先用git log查commitid,然后用git reset撤销commit,之后修改.gitignore再使其生效,最后commit&push即可。

另外,reset也可以用于强制更新本地版本,只需在git pull前运行

git reset --hard

即可

保持本地仓库和远程同步

远程仓库,个人fork,和本地仓库的逻辑关系如下图:

img

当远程仓库更新时,需要先把更新拉到本地,合并好后再push到个人fork的仓库中。具体流程为:

  1. 添加远程仓库到本地remote分支

    1
    git remote add upstream  http://xxxxxx.git
  2. 查看当前仓库的远程分支

    1
    git remote -v
  3. fetch 远程分支

    1
    git fetch upstream
  4. 合并 fetch 的分支到本地(此处应该和develop保持一致,故merge develop分支)

    1
    git merge upstream/develop
  5. 推送本地到远程仓库(自己fork的仓库)

    1
    git push 

更改远程仓库地址

对于原本就是clone的repo,直接添加链接会报错,需要加一句git remote rm orgin

1
2
3
4
5
6
7
cd existing_folder
git init
git remote rm origin
git remote add origin https://xxx.git
git add .
git commit -m "init"
git push -u origin master

2019年11月27日更新:

1
2
conda env export > environment.yml
conda env create -f environment.yml

可以导出environment配置环境:

https://datascience.stackexchange.com/questions/24093/how-to-clone-python-working-environment-on-another-machine

另外,home/xxx/.conda/pkgs会保存很多安装包,可以通过用conda clean -p删除未使用的的包(https://segmentfault.com/q/1010000017438362)

删除环境:conda remove -n your_env_name –all


conda cheatsheet

首先,尝试conda list,提示not command,解决方法:

在.bashrc 的末尾添加如下一行:

export PATH=/opt/anaconda3/bin/:$PATH

之后conda list,正常。

创建:

conda create -n vso python=2.7

激活:

source activate vso

然后就可以开始安装需要的package

pip install imutils

pip install numpy

pip install opencv-python:遇到报错:libSM.so.6: cannot open shared object file: No such file or directory,解决方案:
https://blog.csdn.net/liuyingying0418/article/details/84580254

(pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple)

pip install dlib:安装dlib的时候又出现了cmake报错,用pip install CMake,搞定

pip install scipy

pip install matplotlib

pip install sklearn

pip install ffmpeg-normalize

conda install ffmpeg

conda install -c conda-forge librosa=0.6.3

conda install x264 ffmpeg -c conda-forge(为了用h.264编码,参考:https://teratail.com/questions/156621

sklearn包中的K-Means算法

1.  函数:sklearn.cluster.``KMeans

*class *sklearn.cluster.``KMeans(n_clusters=8init=’k-means++’n_init=10max_iter=300tol=0.0001precompute_distances=’auto’verbose=0random_state=Nonecopy_x=Truen_jobs=Nonealgorithm=’auto’)

  1. 主要参数

n_clusters:要进行的分类的个数,即上文中k值,默认是8

init:‘k-means++’, ‘random’ or an ndarray

‘k-means ++’:使用k-means++算法,默认选项

‘random’:从初始质心数据中随机选择k个观察值

第三个是数组形式的参数

n_init:使用不同的初始化运行算法的次数

max_iter  :最大迭代次数。默认300

random_state:设置某个整数使得结果固定

n_jobs: 设置并行量 (-1表示使用所有CPU)

  1. 主要属性:

cluster_centers_ :集群中心的坐标

labels_ : 每个点的标签

  1. 官网示例:
1
2
3
4
5
6
7
8
9
10
11
12
>>> from sklearn.cluster import KMeans
>>> import numpy as np
>>> X = np.array([[1, 2], [1, 4], [1, 0],
... [10, 2], [10, 4], [10, 0]])
>>> kmeans = KMeans(n_clusters=2, random_state=0).fit(X)
>>> kmeans.labels_
array([1, 1, 1, 0, 0, 0], dtype=int32)
>>> kmeans.predict([[0, 0], [12, 3]])
array([1, 0], dtype=int32)
>>> kmeans.cluster_centers_
array([[10., 2.],
[ 1., 2.]])

5.  My code:

1
2
3
4
5
6
7
8
9
10
%matplotlib inline
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
import numpy as np
X = np.array([[1, 2], [1, 4], [1, 0], [4, 2], [4, 4], [4, 0]])
plt.plot(X[:,0],X[:,1],'x')
kmeans = KMeans(n_clusters=2).fit(X)
print(kmeans.labels_)
print(kmeans.predict([[0, 0], [4, 4]]))
print(kmeans.cluster_centers_)

聚类算法衡量指标

1.  函数:sklearn.metrics.``silhouette_score

sklearn.metrics.``silhouette_score(Xlabelsmetric=’euclidean’sample_size=Nonerandom_state=None, **kwds)

  1. 实例:

https://scikit-learn.org/stable/auto_examples/cluster/plot_kmeans_digits.html#sphx-glr-auto-examples-cluster-plot-kmeans-digits-py

sklearn包中的K-Means算法

1.  函数:sklearn.mixture.``GaussianMixture

sklearn.mixture.``GaussianMixture(n_components=1covariance_type=’full’tol=0.001reg_covar=1e-06max_iter=100n_init=1init_params=’kmeans’weights_init=Nonemeans_init=Noneprecisions_init=Nonerandom_state=Nonewarm_start=Falseverbose=0verbose_interval=10)

  1. 实例:

https://scikit-learn.org/stable/auto_examples/mixture/plot_gmm_covariances.html#sphx-glr-auto-examples-mixture-plot-gmm-covariances-py

https://scikit-learn.org/stable/auto_examples/mixture/plot_gmm_selection.html#sphx-glr-auto-examples-mixture-plot-gmm-selection-py

聚类结果可视化

参考代码:A demo of K-Means clustering on the handwritten digits data
直接plot出来点太密集了,所以考虑随机抽取5k个点来plot,参考:np.random.randint、np.random.choice、random.sample三种随机函数的用法案例
结果如下:

先聚类后PCA

直接对原始的数据进行聚类,结果如下:

Weighted k-means

第一个方法

Clustering the US population: observation-weighted k-means
github-observation_weighted_kmeans

这是直接对data加权值,有对应的代码,但是数据结构用的是它自己的project,需要改写。

第二个方法:weighted kernel kmeans

WEIGHTED KERNEL K-MEANS 加权核K均值算法理解及其实现(一)
上文中提到,[1]中使用了这个方法,这个方法最初在[2]提到。有现成的代码库实现:
tslearn.clustering.GlobalAlignmentKernelKMeans
这个是现成的工具包,若要直接使用可以设置一个最简单的y=x的kernel即可。

Reference

[1]Weighted Graph Cuts without Eigenvectors:A Multilevel Approach

[2]Kernel k-means, Spectral Clustering and Normalized Cuts

聚类算法一览

https://www.cnblogs.com/lc1217/p/6893924.html

https://www.cnblogs.com/lc1217/p/6908031.html

https://www.cnblogs.com/lc1217/p/6963687.html

GMM vs K-means

https://www.jianshu.com/p/a4d8fa39c762

https://www.jianshu.com/p/13898e68c5c6

sklearn

https://scikit-learn.org/stable/modules/generated/sklearn.cluster.KMeans.html

https://scikit-learn.org/stable/modules/generated/sklearn.metrics.silhouette_score.html

https://scikit-learn.org/stable/auto_examples/cluster/plot_kmeans_digits.html#sphx-glr-auto-examples-cluster-plot-kmeans-digits-py

https://scikit-learn.org/stable/modules/generated/sklearn.mixture.GaussianMixture.html

https://scikit-learn.org/stable/auto_examples/mixture/plot_gmm_selection.html#sphx-glr-auto-examples-mixture-plot-gmm-selection-py

本文在 http://www.cnblogs.com/pinard/p/6239403.htmlhttps://www.cnblogs.com/pinard/p/6243025.html 的内容基础上做了一些笔记和补充,强调了我认为重要的部分,其中一些细节不再赘述。

Jupiter notebook版本参见我的github:

https://github.com/konatasick/machine_learning_note/blob/master/pca.ipynb

PCA的思想

PCA(Principal components analysis,主成分分析)是一种降维算法,它通过使样本间方差尽量大来尽可能保留原始数据的相关关系。

PCA的算法

1
2
3
4
5
6
7
8
9
1) 对所有的样本进行中心化

2) 计算样本的协方差矩阵

3) 对协方差矩阵进行特征值分解

4)取出最大的m个特征值对应的特征向量, 将所有的特征向量标准化后,组成特征向量矩阵W。

5)对样本集中的每一个样本转化为新的样本

scikit-learn的sklearn.decomposition.PCA参数介绍

官方文档:https://scikit-learn.org/stable/modules/generated/sklearn.decomposition.PCA.html

Parameters:

n_components:这个代表了需要降维的维度。当它是整数时,代表了保留的维度数量。当它是一个介于0~1之间的数时,代表了主成分的方差所占的最小比例,例如0.95代表取超过95%的量的维度。当它为’mle’;,同时svd_solver == ‘full’;时,系统会根据MLE算法自动选择维度。(此时svd_solver == ‘auto’;将会被解读为svd_solver == ‘full’;)

svd_solver:默认是’auto’;,即在剩下的’full’;, ‘arpack’;, ‘randomized’;中根据情况选一个。’full’;是传统的PCA,’arpack’;, ‘randomized’;适用于数据量大的场景,其区别在于前者是通过scipy.sparse.linalg.svds实现。

Attributes*:

components_ : 主成分的投影坐标,代表了数据的最大方差的方向,根据explained_variance_由大到小排列。维度是m*n,其中n是原始数据的维度,m是降维后的维度。

explained_variance_和explained_variance_ratio_:前者是每一维的方差,后者是所占比例:

explained_variance_ratio_=explained_variance/sum(explained_variance_)

维度是m, 当m=n时,sum(explained_variance_ratio_)=1。

mean_:每个feature的平均值。在pca算法的第一步,需要对feature归一化,此时的平均值保留在这里。

n_components_:模型实际的降维数,即m。

PCA实例

https://www.cnblogs.com/pinard/p/6243025.html 中示范了降维的操作。

首先我们生成随机数据并可视化,代码如下:

1
2
3
4
5
6
7
8
9
10
11
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
%matplotlib inline
from sklearn.datasets.samples_generator import make_blobs
# X为样本特征,Y为样本簇类别, 共1000个样本,每个样本3个特征,共4个簇
X, y = make_blobs(n_samples=10000, n_features=3, centers=[[3,3, 3], [0,0,0], [1,1,1], [2,2,2]], cluster_std=[0.2, 0.1, 0.2, 0.2],
random_state =9)
fig = plt.figure()
ax = Axes3D(fig, rect=[0, 0, 1, 1], elev=30, azim=20)
plt.scatter(X[:, 0], X[:, 1], X[:, 2],marker='o')

输出如图:

现在我们来进行降维,从3维降到2维,代码如下:

1
2
3
4
5
6
from sklearn.decomposition import PCA
pca = PCA(n_components=2)
pca.fit(X)
X_new = pca.transform(X)
plt.scatter(X_new[:, 0], X_new[:, 1],marker='o')
plt.show()

输出如图:

在很多应用中,当我们将数据降维并用于训练后,训练出来的模型之后的输出也是降维后的数据,需要还原回原始维度。这时候需要将pca算法进行逆运算:

X_old=np.dot(X_new,pca.components_)+pca.mean_

即将新数据和components_相乘并加上平均值。

使用上文的例子,代码如下:

1
2
3
4
X_old=np.dot(X_new,pca.components_)+pca.mean_
fig = plt.figure()
ax = Axes3D(fig, rect=[0, 0, 1, 1], elev=30, azim=20)
plt.scatter(X_old[:, 0], X_old[:, 1], X_old[:, 2],marker='o')

输出如图:

可以看到,数据即是投影到最大方差方向但并未进行降维时的样子。

*parameter的命名后面没有下划线,而attribute的命名后面都有下划线,以此区分。