cpuwdl 发布的文章

Keras图像分类预告

Keras是一个Python编写的深度学习框架,可以用于图像分类,通过设计多层卷积神经网络模型,在对已标注图像进行训练后,可以对判断测试图像类型。

一个基本的图像分类应用包含的模块有:读取图像,模型设计,模型训练,测试图像。准备不同版本的各个模块,可以更方便地在需要时进行组合即可使用。

1.读取图像

图像数据集的保存方式一般是在同一文件夹中有若干对应类型的图像,每个文件夹表示一类图像,训练集和测试集可能分开或者不分开。

使用glob工具可以比较方便地获取目录中所有文件的名称,知道路径之后获取图像信息的方法有很多,运行速度有差别。

数据集大小:大、小。

在图像中获取所需尺寸的图像:随机位置、指定若干位置(所需尺寸比原图大时多种padding方法)、缩放。

数据集扩充:自带的生成器、自定义生成器(多进程)。

2.模型设计

模型的设计通常需要参考已有的模型,可以进行一些修改或者是同时使用多个模型。对于一些比较有名的模型,Keras中提供了相应的预训练模型,将设计好的模型使用ImageNet大型图像数据集进行训练后,得到的模型就是预训练模型,在它的基础上用自己的数据集进行参数的调整,可以用较小的代价得到优秀的图像分类模型。

预训练模型对图像尺寸都有最小值的要求,并且有默认值,常见的方法中模型输入图像的尺寸是固定的。

将多个模型放到一起,组成一个更大的模型,有时候可以取得更好的结果。

3.模型训练

对于同一个模型,使用不同的训练方法得到的结果有所差异,需要设置的有:优化器种类,学习率等优化器参数,训练的终止时刻。

不同的优化器性能不同,应用场景不同,参数设置方法不同,需要根据实际情况进行调整。Keras中提供的常用方法有:ModelCheckpoint,EarlyStopping,LearningRateScheduler,TensorBoard,ReduceLROnPlateau。

4.测试图像

模型的每一轮训练都会产生一个参数文件,通常是选择验证集准确率最高或者损失最小的模型,有时候可以多选几个模型作为参考。

将一幅图像进行某种处理,可以产生多幅图像,将预测结果平均,可能会得到更好的结果。


使用unicodedata和regex将文本中的组合字符拆分

文本处理时有时候需要将组合字符对应到同一个字符,不同种类的组合字符拆分的结果会有区别,这里的组合字符以法语字符举例。

代码示例如下:

import regex as re
import unicodedata
text = u'à ? ? è é ê ? ? ? ? ù ? ? ?'
print (text)
text = unicodedata.normalize('NFD',text)
print (text)
text = re.sub(ur'\p{M}',u'',text)
print (text)

输出结果为:

à ? ? è é ê ? ? ? ? ù ? ? ?
a? a? c? e? e? e? e? i? i? o? u? u? ? C?
a a c e e e e i i o u u ? C

其中的NFD可以换成NFKD,在当前情况下结果相同,在控制台中的输出和这里显示的有些不一样。

unicodedata.png

第二行中的数据被拆分为:

u'a\u0300 a\u0302 c\u0327 e\u0300 e\u0301 e\u0302 e\u0308 i\u0302 i\u0308 o\u0302 u\u0300 u\u0302 \u0153 C\u0327'


使用nginx隐藏admin入口地址

对于一些默认使用http://domain/admin作为后台地址的应用,如果它通过一些特殊的设定,使得入口地址难以修改,可以使用nginx将入口地址修改。使用方法是在对应网站的nginx设置中增加如下内容,可将入口地址修改为admin_hidden。其中主要为rewrite的两行,其他的部分使用应用的伪静态设置,如果没有伪静态设置,增加这两行即可。

location / { 
   if (!-e $request_filename) {
      rewrite  ^/admin$ /admin_error;
      rewrite  ^/admin_hidden$ /admin;
      rewrite  ^(.*)$ /index.php?s=$1  last;
      break;
   }
}

python中正则表达式regex库的使用

python中内置了re模块,可以根据正则表达式处理字符串,对于一些问题,使用regex库可以更方便的解决。

安装:

sudo pip install regex

我使用的版本为python2.7,在处理unicode字符串时需要指定字符编码,python3需要进行相应修改。

载入文本:

f = codecs.open(PATH,'r','utf-8')
lines = f.readlines()

通过pandas载入文件:

df = pandas.read_csv(PATH,encoding='utf-8')

Unicode字符编码分为如下几类,具体的分类可以参考:https://www.cnblogs.com/qixuejia/p/4211428.html

P:标点字符;

L:字母; 

M:标记符号(一般不会单独出现);

Z:分隔符(比如空格、换行等);

S:符号(比如数学符号、货币符号等);

N:数字(比如阿拉伯数字、罗马数字等);

C:其他字符

使用如下代码可以将字符串text中的标点字符和数字全部替换为空格,可以根据情况自行修改。

import regex as re
text = re.sub(ur"\p{P}+|\p{N}+", u' ', text)

ubuntu系统中安装php-gd库

ubuntu系统中安装gd库,需要根据php的版本进行安装。

sudo apt-get install php-gd

或者

sudo apt-get install php5.6-gd

重启服务器可以生效,或者使用命令

sudo kill -USR2 $(pgrep php-fpm)

可以重启php服务。

检测gd库是否开启,可以使用

php5.6 -m | grep -i gd

或者

php -i | grep -i --color gd

在使用一些php应用时,需要检测gd库是否开启,当该应用使用的检测代码是gdversion()时,有时候会失效。这时参考tz.php,使用下面这段代码,可以正常检测gd库的安装,并且正常使用例如验证码等功能。

if(function_exists(gd_info)){
    $sp_gd = @gd_info();
}
else{
    $sp_gd = 0;
}