本人的博客已经移至:https://subaochen.github.io,这个博客亦会长期保留。
深度学习入门路径
深度学习入门路径
1 准备理论知识
- 数学知识
- 如果只是将深度学习应用到工程领域,大学的数学课基本就够用了,包括微积分、偏微分、基本的线性代数,基本的概率知识。我的数学知识遗忘的比较厉害,颇费了些周折才重新了解了一些基本概念,主要参考了网易云课堂的这个课程:机器学习中的数学知识,个人觉得雷老师讲的还是不错的。这个数学知识课程我没有全部听完,机器学习这一块就转门到吴恩达了。
- 机器学习
- 深度学习是机器学习的一个分支,因此要学习深度学习就不能不搞清楚机器学习的基本原理,这方面吴恩达是绝好的引路人,他的课程个人认为是不二之选:吴恩达机器学习。吴恩达的这个课程有必要全部听完,我目前也只是听了一大半,需要继续努力。
2 搭建开发环境
3 阅读tensorflow的官网资料
- tutorial中的get started,Learn and ML的全部,research and experimentation的全部,Sequence中的Text generation with RNN,Load Data,Data representation。
- guide中的keras,eager execution,importing data,embeddings。
- 熟悉API文档的结构。
4 先玩转一个方向
开始行动比雄心万丈更重要!
使用循环神经网络RNN生成文本
“熟读唐诗三百首,不会作诗也会溜”,似乎揭示了人们学习写作的某种套路,现在让RNN来显示它的威力吧:-)

从源代码编译tensorflow 2.0
趁tensorflow 2.0.0-alpha0刚刚发布,尝个鲜,却不料遭到蒙头一棍:pip install tensorflow-gpu==2.0.0-alpha0安装起来,简单的导入tensorflow会导致core dump!尝试了不同的python版本,也尝试了cpu版本,结果都是一样。郁闷中打开core dump,挑了其中的几个关键词放狗去搜,才发现是因为我电脑的老U不支持AVX:当年的推土机已垂垂老矣。tensorflow预编译版本都默认打开了AVX,因此在老的不支持AVX的CPU上面安装tensorflow 2,无论CPU版本还是GPU版本都会core dump。无奈,只好从源代码自己编译一个出来。在https://www.tensorflow.org/install/source里面已经很详细的说明了编译tensorflow的步骤,下面是几个不大不小的坑:
版本的选取
从github clone下来tensorflow之后,要checkout相应的版本再进行编译的操作。对于我的情况,是首先执行如下的命令:
git branch -a # 检查有哪些分支?
git checkout v2.0 # 捡取v2.0分支进行编译
创建必要的python虚拟环境
编译bazel的时候需要用到keras的一些依赖库,因此最好是在编译之前创建虚拟环境并安装keras:
conda create -n tf2 python=3.7
conda activate tf2
conda install keras-preprocessing
bazel build ……
然后,在整个编译过程中,都要在这个虚拟环境中进行。
下载合适的bazel版本
编译tensorflow不要安装最新的bazel。我这边使用23.0版本刚刚好,再新一点点都会报错,非常奇怪的问题。
最好设置git代理
编译过程中要从github下载好几个软件,因此最好设置git代理以加快下载速度:
git config –global http.proxy localhost:1080
git config –global https.proxy localhost:1080
# 下面的命令可以取消代理设置:
# git config –global –unset http.proxy
# git config –global –unset https.proxy
有充分的耐心
整个编译过程在我的机器上要耗费5-6个小时。
一道简单概率题的求解-使用贝叶斯公式
一道简单概率题的求解-使用贝叶斯公式
表示此人为不易出事故者。所求概率为:
python 3.7下安装tensorflow-cpu
python 3.7下安装tensorflow-cpu
- python3 -m venv $HOME/tensorflow # 创建一个tensorflow的虚拟环境
- source $HOME/tensorflow/bin/activate # 激活tensorflow虚拟环境
- 从这里下载tensorflow 1.12版本:https://pypi.org/project/tensorflow/#files,最新的版本目前是:tensorflow-1.12.0-cp36-cp36m-manylinux1_x86_64.whl 。
- 把下载的文件改一下名字:mv tensorflow-1.12.0-cp36-cp36m-manylinux1_x86_64.whl tensorflow-1.12.0-cp37-cp37m-manylinux1_x86_64.whl
- 执行pip install tensorflow-1.12.0-cp37-cp37m-manylinux1_x86_64.whl
在ubuntu18.04以上版本安装pdftk
在ubuntu18.04以上版本安装pdftk
- 从源代码安装。pdftk的官网有个如何在redhat上编译的说明如何在redhat上编译的说明可以参考。
- 使用snap安装,步骤如下:
sudo snap install pdftk sudo ln -s /snap/core/usr/bin/pdftk /usr/bin/pdftk
dia无法输入中文的终极解决方法
dia无法输入中文的终极解决方法
1 从启动栏或者快捷方式启动dia的中文输入问题
2 在终端启动时增加启动设置
linux中启用输入时禁用触摸板
linux中启用输入时禁用触摸板
Java Class文件结构:常量池
Java Class文件结构:常量池
目录
1 概念的引入
- 属性名称“var”是一个字符串常量;
- 属性的数据类型是int,在class文件中通过单个大写字母I(这也是一个字符串常量)表示int;
:
- 复用常量,压缩class文件的尺寸。比如描述int m;这个属性时,就可以复用I(表示int)这个字符串了。
- 可使用精简的符号表示复杂的含义,比如上述的I表示int,进一步压缩class文件的尺寸。
- 方便扩展。当需要定义新的常量时,只需要在常量池中添加即可。
2 一些术语
2.1 全限定名(Fully Qualified Name)
2.2 描述符(Descriptor)
2.2.1 属性描述符
。比如属性定义:String str
的描述符为:Ljava/lang/String;
。
[[D
。
描述符
|
数据类型
|
说明
|
B
|
byte
|
字节
|
C
|
char
|
字符
|
D
|
double
|
双精度
|
F
|
float
|
单精度
|
I
|
int
|
整数
|
J
|
long
|
长整数
|
L ClassName ;
|
reference
|
ClassName对象
|
S
|
short
|
短整数
|
Z
|
boolean
|
true/false
|
[
|
reference
|
一维数组
|
2.2.2 方法描述符
方法定义
|
方法描述符
|
String doSomething(int a, double b,Thread t){...} |
(IDLjava/lang/Thread;)Ljava/lang/String |
void doSomething(int a,double b,Thread t){...} |
(IDLjava/lang/Thread;)V |
void doSomething(int[][] a) |
([[I)V |
。这个问题作者还没有搞的太清楚,应该需要从Java虚拟机调用方法的栈机制去调查,从方法描述符的限制中找不到线索。
3 常量池的总体结构
常量表项类型
|
标志
|
Java SE
|
描述
|
CONSTANT_Utf8_info
|
1
|
1.0.2
|
Utf8编码的字符串
|
CONSTANT_Integer_info
|
3
|
1.0.2
|
整数
|
CONSTATN_Float_info
|
4
|
1.0.2
|
单精度浮点数
|
CONSTANT_Long_info
|
5
|
1.0.2
|
长整数
|
CONSTANT_Double_info
|
6
|
1.0.2
|
双精度浮点数
|
CONSTANT_Class_info
|
7
|
1.0.2
|
类
|
CONSTANT_String_info
|
8
|
1.0.2
|
字符串
|
CONSTANT_Fieldref_info
|
9
|
1.0.2
|
属性
|
CONSTANT_Methodref_info
|
10
|
1.0.2
|
方法
|
CONSTANT_InterfaceMethodref_info
|
11
|
1.0.2
|
接口方法
|
CONSTANT_NameAndType_info
|
12
|
1.0.2
|
名称和类型
|
CONSTANT_MethodHandler_info
|
15
|
7
|
方法句柄?
|
CONSTANT_MethodType_info
|
16
|
7
|
方法类型
|
CONSTANT_Dynamic_info
|
17
|
11
|
|
CONSTANT_InvokeDynamic_info
|
18
|
7
|
|
CONSTANT_Module_info
|
19
|
9
|
模块
|
CONSTANT_Package_info
|
20
|
9
|
包
|
4 Utf8字符串常量
。因此Utf8编码的字符串表项(CONSTANT_Utf8_info)结构如5所示,需要使用一个u2类型的数据说明字符串的实际长度。
Constant pool: #1 = Methodref #4.#16 // java/lang/Object."<init>":()V #2 = Fieldref #3.#17 // Person.age:I #3 = Class #18 // Person #4 = Class #19 // java/lang/Object #5 = Utf8 age #6 = Utf8 I|\longremark{属性的数据类型:int}| #7 = Utf8 <init>|\longremark{构造方法}| #8 = Utf8 ()V|\longremark{方法的descriptor,这里是一个参数列表为空,返回值为void的方法描述符}| #9 = Utf8 Code #10 = Utf8 LineNumberTable #11 = Utf8 isAdult #12 = Utf8 ()Z|\longremark{方法的描述符(descriptor),参数列表为空,返回值为boolean}| #13 = Utf8 StackMapTable #14 = Utf8 SourceFile #15 = Utf8 Person.java #16 = NameAndType #7:#8 // "<init>":()V|\longremark{由\#7和\#8号Utf8字符串组成的名称和类型常量表项}| #17 = NameAndType #5:#6 // age:I|\longremark{由\#5和\#6号Utf8字符串常量表项组成的名称和类型常量表项}| #18 = Utf8 Person #19 = Utf8 java/lang/Object |\showremarks|
5 整数常量(Integer)和单精度浮点数(Float)常量
6 长整数(Long)和双精度浮点数(Double)常量
7 类(Class)常量
public interface IPerson{ boolean isAdult(); }
Classfile /home/subaochen/git/blog/src/java/IPerson.class Last modified 2018年12月9日; size 119 bytes MD5 checksum 2b865ff3610a20333b6df52384c1c38d Compiled from "IPerson.java" public interface IPerson minor version: 0 major version: 55 flags: (0x0601) ACC_PUBLIC, ACC_INTERFACE, ACC_ABSTRACT this_class: #1 // IPerson super_class: #2 // java/lang/Object interfaces: 0, fields: 0, methods: 1, attributes: 1 Constant pool: #1 = Class #7 // IPerson #2 = Class #8 // java/lang/Object #3 = Utf8 isAdult #4 = Utf8 ()Z #5 = Utf8 SourceFile #6 = Utf8 IPerson.java #7 = Utf8 IPerson #8 = Utf8 java/lang/Object { public abstract boolean isAdult(); descriptor: ()Z flags: (0x0401) ACC_PUBLIC, ACC_ABSTRACT } SourceFile: "IPerson.java"
8 字符串(String)常量
9 名称和类型(NameAndType)常量
数据类型
|
描述
|
备注
|
u1
|
tag
|
标签=12(0x0C)
|
u2
|
name_index
|
字段和属性的名称索引
|
u2
|
descriptor_index
|
字段和属性的描述符索引
|
10 字段、方法和接口方法常量
#1 = Methodref #4.#16 // java/lang/Object."<init>":()V #2 = Fieldref #3.#17 // Person.age:I #3 = Class #18 // Person #4 = Class #19 // java/lang/Object ... #16 = NameAndType #7:#8 // "<init>":()V #17 = NameAndType #5:#6 // age:I