今天,你算法了没?
关注:九三智能控,每天学点AI算法
AI技术可以说是真正的规则改变者。AI在医疗领域的应用非常广泛,先进的AI工具可以帮助医生和研究人员更好的诊断疾病。比如,某位尼日利亚的医生就可以使用本算法对血液样本进行疾病检测,使其能更深入了解疾病,并找到更好的治疗方法。这就是AI技术的魅力所在!
此外,开发好的AI算法是世界通用的,MIT或其他研究机构开发的新工具和技术可以很快的被其他地区(比如尼日利亚)应用。
机器学习的主要问题
机器学习是现今AI技术的主战场。制约机器学习技术发展的两个主要问题是:算力和数据来源。这两个问题现在有了一些可行的解决办法:
Kaggle: Kaggle解决了数据库来源的问题。Kaggle可以说是是当今最好的数据库平台,你可以在上面创建并发布数据库,供其他用户使用。人们利用Kaggle数据库实现了一些非常有用的成果。
Google co-lab:如果你有一个Google账号,那么你就可以免费的应用Google co-lab上的GPU开展机器学习研究了,这无疑是对机器学习发展的一大助益。否则,对于个人很难获得如此强大的算力。
血液细胞数据库
数据库对于数据科学家来说,就像金矿一般。一个针对特定问题的数据库,可以为研究团队提供非常大的帮助。因为我们不用再费力去搜集和存储数据了。
本算法所用数据库就来自Kaggle平台,共包括12500张增强的血液细胞图片。
数据库分为4个类别,每个类别包括约3000张图片。为了便于训练,我们将图片的大小缩减为80x80x3。
使用Google co-lab
通常Kaggle需要进行登录才能下载数据库。但如果我们使用co-lab的化,不需要将数据库下载到本地,而可以直接用co-lab进行调用。
通常,你可以利用Kaggle CLI 来下载数据库或提交比赛代码。当你注册Kaggle时,你可以下载Kaggle.json,该文件包含了Kaggle的所有凭证。Kaggle CLI就是利用这些凭证来进行验证的。具体方法如下:
(1)创建一个新单元(cell)以及一个名为.kaggle的隐藏文件夹
!mkdir .kaggle
(2)在新建单元中安装Kaggle CLI:
!pip install kaggle
(3)下载数据库:
!kaggle datasets download -d paulthimothymooney/blood-cells
(4)确认所有文件夹已被下载:
!ls dataset2-master/images
你可以看到3个文件夹:TEST, TEST_SIMPLE 和TRAIN。TRAIN文件夹中包含了说有训练用图片,我们就是利用这个文件夹进行训练。
我们需要将血液细胞图像作为numpy数组导入,并输入到神经网络中进行训练。本算法采用Keras创建神经网络,Keras可以提供ImageDataGenerator库,该库可以处理大多数的前处理任务。
from keras.models import Sequential
from keras.layers import Dense, Conv2D, Dropout, MaxPool2D, Flatten
from keras.preprocessing import image
keras.preprocessing 提供了处理各类数据库所必须的方法及对象,可以根据所需要求来创建ImageDataGenerator。
generator = image.ImageDataGenerator(
rescale = 1./255,
featurewise_center=False, # set input mean to 0 over the dataset
samplewise_center=False, # set each sample mean to 0
featurewise_std_normalization=False, # divide inputs by std of the dataset
samplewise_std_normalization=False, # divide each input by its std
zca_whitening=False, # apply ZCA whitening
rotation_range=10, # randomly rotate images in the range (degrees, 0 to 180)
width_shift_range=0.1, # randomly shift images horizontally (fraction of total width)
height_shift_range=0.1, # randomly shift images vertically (fraction of total height)
horizontal_flip=True, # randomly flip images
vertical_flip=False)
前面提到过,训练数据存储在"dataset2-master/images/TRAIN"文件夹中,我们将该路径提交给ImageDataGenerator。这样,就可以将所有配置和图像增强施加到训练图像上。
dataset = generator.flow_from_directory(
shuffle = True,
batch_size = 32,
target_size = (80, 80),
directory = 'dataset2-master/images/TRAIN'
)
以上就是全部的前处理方法,当然你可以通过调整参数来加强或减弱图像增强效果,通常增强方法都有很大的改进空间。
训练模型
本算法采用卷积神经网络(CNN)进行训练,模型框架如下所示。
训练模型通过以下代码进行调用:
def model():
model = Sequential()
model.add(Conv2D(80, (3,3), strides = (1, 1), activation = 'relu'))
model.add(Conv2D(64, (3,3), strides = (1, 1), activation = 'relu', input_shape = (80, 80, 3)))
model.add(MaxPool2D(pool_size = (2,2)))
model.add(Conv2D(64, (3,3), strides = (1,1), activation = 'relu'))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(128, activation = 'relu'))
model.add(Dropout(0.5))
model.add(Dense(4, activation = 'softmax'))
model.compile(loss = 'categorical_crossentropy', optimizer = 'adadelta', metrics = ['accuracy'])
return model
最后,我们队模型进行训练:
nn = model()
nn.fit_generator(dataset, steps_per_epoch = None, epochs = 30, verbose = 1)
nn.save('Model.h5')
经过30次的迭代,我们获得了92.67%的准确率。后续可以通过增加网络层数或者调整超参数来改进准确率。
发布模型
模训练完成后,我们需要将模型进行发布,以便其他用户使用。发布模型的方法有很多,由于我们想让模型能在客户端上运行,所以最终采用Web app来发布。
建立客户端应用,需要遵循以下的要求及框架。
App 框架
安装node和npm,并进行环境设置。
npm install -g create-react-app
create-react-app app_name
cd app_name
npm install --save @tensorflow/tfjs
//on server side:
mkdir server
cd server
npm init
//fill up the details, make sure package.json is created
npm install express --save
这里用了一个express.js REST根节点,用户在客户端可以通过发送TEST GET请求来获取模型文件。
let express = require('express')
let cors = require('cors')
let path = require('path')
var app = express()
let static_path = path.join(__dirname, 'ModelData/model_data')
app.use(cors())
app.use(express.static(static_path))
app.get('/model_metadata', (req, resp) => {
resp.sendFile(static_path+'/model.json')
})
app.listen(5443, () => console.log('Serving tfjs model on express API server'))
接下来,我们需要将模型与tfjs进行兼容,tensorflow提供了一个tensorflowjs的Python库,可以用来处理js文件。安装代码如下:
pip install tensorflowjs
安装完成后,我们可以利用tensorflowjs_converter将模型转换成tfjs格式:
$tensorflowjs_converter --input_format keras \
Model.h5 \
ModelData/model_data
// Model.h5 is the downloaded model after training, last argument is the target folder, where we need to store the model files.
转换完成后,我们创建了一组名为shard的文件。shard文件是通过将模型各个训练层进行拆解获得的,每个shard文件包含了特定层的超参数。由于shard可以在不同的部位进行存储和调用,所以可以其实现分布式计算。
model.json包含了各个shard文件的信息,当改变了shard文件夹的位置时,则需要更新该文件。进行API调用时,我们仅发送model.json文件给客户端即可。tfjs可以自动的调用各个shard文件,并组装成模型以便用户使用。
推理机(inference engine)开发
下面,我们介绍如何利用tfjs来进行推断(inference)的。
模型包装类(container class):我们为算法模型创建了一个包装类,该类可以用于进行推断。
let modelCache = new ModelContainer(null);
modelCache.loadFromURL('http://192.168.0.105:5443/model_metadata')
运行推断:创建模型对象后,用户就可以在UI界面上随时进行推断处理。