前言
本文是对网络程序设计课程的结课总结,通过半学期的学习,算是初步了解了神经网络,深度学习概念,并能利用深度学习框架做出小的demo。虽然对项目没有做出贡献,但是也在努力的学习着。
课程介绍
基于深度学习神经网络等机器学习技术实现一个医学辅助诊断的专家系统原型,具体切入点为课程项目:对血常规检验报告的OCR识别、深度学习与分析
课程项目A1:神经网络实现手写字符识别系统(课程入门学习)
实验指导 DigitRecogn
项目版本库 np2016
实验重点
- 前馈神经网络
在此种神经网络中,各神经元从输入层开始,接收前一级输入,并输入到下一级,直至输出层。整个网络中无反馈。 - 反向传播神经算法 资料
环境搭建
# 安装pip
sudo apt-get install python-pip
# 用pip安装numpy和scipy, 使用科大镜像加速
pip install --user numpy scipy -i https://pypi.mirrors.ustc.edu.cn/simple
# 如果上一步安装失败就使用ubuntu的包管理器试试
sudo apt-get install python-numpy python-scipy
# 安装sklearn, neural_network_design.py需要调用它做交叉验证
pip install -U scikit-learn -i https://pypi.mirrors.ustc.edu.cn/simple
利用简单的神经网络实现手写字符识别系统,包括前端输入和后台处理输出。
实验小结
正如孟宁老师所言,如果A1实验都做不出来,基本可以选择放弃课设退出了。幸运的,抱着对神经网络的迷之兴趣,我完成了A1部分,并了解学习了有关机器学习,神经网络的相关算法,扩展不够,研究不足,刚好摸下门槛。好,正式开始入坑。
课程项目A2:血常规检验报告的图像OCR识别
实验数据来源:苏州独墅湖科教创新区医院体检报告
实验具体要求 A2
运行环境
# 安装numpy,
sudo apt-get install python-numpy # http://www.numpy.org/
# 安装opencv
sudo apt-get install python-opencv # http://opencv.org/
##安装OCR和预处理相关依赖
sudo apt-get install tesseract-ocr
sudo pip install pytesseract
sudo apt-get install python-tk
sudo pip install pillow
# 安装Flask框架、mongo
sudo pip install Flask
sudo apt-get install mongodb # 如果找不到可以先sudo apt-get update
sudo service mongodb started
sudo pip install pymongo
函数介绍
代码版本库,具体函数详见readme.md
学习心得
本科的时候有用过MATLAB做过有关图像处理方面的算法,实话讲,对图像处理的并不是很感冒,远没有我对机器学习的兴趣大。因此A2部分我并没有花时间去了解,而把更多的时间放在机器学习相关书籍的阅读上。得力于班上的几位大神对A2部分的不懈努力,项目有条不紊的进行。
A2图像的OCR识别具体步骤请参考秦泰然同学的文章链接
课程项目A3:根据血常规检验的各项数据预测年龄和性别
终于到我的趴了。。。关于深度学习框架,我主要了解了keras,也看过keras的许多文档 。通过这个简单快捷的框架,做了关于预测年龄和性别的Demo ,其中对性别的测试能达到70%,利用keras集成的函数对年龄的预测只有10%,于是我重写了重写有关预测函数,准确率也只是提高到了30%,汗!可能数据集过少,或者方法不得当
keras资料介绍
Keras是基于Theano和tensorflow的一个深度学习框架,它的设计参考了Torch,用Python语言编写,是一个高度模块化的神经网络库,支持GPU和CPU。
1. 官方文档 https://keras.io/
2. 中文文档 http://keras-cn.readthedocs.io/en/latest/
3. keras examples https://github.com/fchollet/keras/tree/master/examples
运行环境
# 安装numpy
sudo apt-get install python-numpy # http://www.numpy.org/
# 安装keras
sudo pip install keras
实验代码
# -*- coding: utf-8 -*-
import numpy as np
from keras.models import Sequential
from keras.layers.core import Dense, Dropout, Activation
from keras.optimizers import SGD, Adam, RMSprop
from keras.utils import np_utils
import csv
import codecs
from time import sleep
batch_size = 128 #训练集大小
nb_classes = 100 #一共两类
nb_epoch = 200 #训练200轮
def evaluate(result,y_test):
#return y_test[2]
# return y_test[0][2] - X_test[0][2]
num = 0;
i = 0;
for i in range(200):
if(abs(result[i] - y_test[i]) <=5):
num += 1;
i += 1;
return (float)(num/200.0)
def load_data():
x_train=[]
Y_train=[]
x_test=[]
Y_test=[]
f = open("train2.txt","r")
i = 0;
for line in f.readlines():
line = line.split(",")
if i>0:
Y_train.append(int(float(line[1])))
x_train.append(line[2: ])
i += 1
x1=np.array(x_train)
y1=np.array(Y_train)
f.close()
f = open("test.txt","r")
i = 0;
for line in f.readlines():
line = line.split(",")
if i>0:
Y_test.append(int(float(line[1])))
x_test.append(line[2: ])
i += 1
x2=np.array(x_test)
y2=np.array(Y_test)
f.close()
return (x1, y1), (x2, y2)
# the data, shuffled and split between train and test sets
(X_train, y_train), (X_test, y_test) = load_data()
#训练集和测试集转化为矩阵
X_train = X_train.reshape(1858, 26).astype('float32')
X_test = X_test.reshape(200, 26).astype('float32')
#对数据进行归一化到0-1 因为样本中血液检查指标数据最大是
X_train /= 300
X_test /= 300
#keras 提供的方法实现label的binary class matrices
Y_train = np_utils.to_categorical(y_train, nb_classes)
Y_test = np_utils.to_categorical(y_test, nb_classes)
#搭建网络
model = Sequential()
#输入层,输入维度27,输出维度32.第一层必须填写,后续层可以自动推导
model.add(Dense(32, input_shape=(26,)))
model.add(Activation('relu'))
model.add(Dropout(0.2))
#隐藏层1
model.add(Dense(output_dim=32))
model.add(Activation('relu'))
model.add(Dropout(0.2))
#隐藏层2
model.add(Dense(output_dim=28))
model.add(Activation('relu'))
model.add(Dropout(0.2))
#输出层 ,Softmax分类,输出是100类
model.add(Dense(output_dim=100))
model.add(Activation('softmax'))
#model.compile编译接受3个参数 loss(categorical_crossentropy), optimizer(优化器)Nadam RMSprop,metrics指标列表(评估模型在训练和测试时的网络性能的指标 )
model.compile(loss='categorical_crossentropy',optimizer='RMSprop',metrics=['accuracy'])
#model.fit接受6个参数,训练数据,标签,每个batch包含的样本数,训练轮数,是否打乱,日志显示(0不输出日志信息,1输出进度条,2每轮训练输出一条记录),是否显示精确度,选择作为验证集的比例
history = model.fit(X_train, Y_train, batch_size=batch_size, nb_epoch=nb_epoch, verbose=1,
validation_data=(X_test, Y_test))
result = []
result = model.predict_classes(X_test,batch_size=batch_size,verbose=1)
# 单例测试
data = [82,56,9.9,7.6,0.11,11.8,2.28,23.1,0.71,7.2,6.63,67.1,0.2,5.26,2,0.06,0.6,0.12,1.3,0.17,1.8,165,0.486,92,31.4,340,12,145]
test =[]
test.append(data[2: ])
arrtest=np.array(test)
result = model.predict_classes(arrtest,batch_size = batch_size,verbose = 0)
print result
###正确率计算
#print len(result)
#print len(y_test)
#for r in result:
# print r
#score = model.evaluate(X_test, Y_test, verbose=1)
#score = evaluate(result,y_test)
#or x in y_test:
# print x
#print('Test accuracy:', score)
print "end"
将A3部分用keras框架实现的年龄和性别预测demo 集成到A2中,一直出现bug.见下图
以为是flask和pymongo版本问题,但一直找不到解决问题的方法,原因是mongodb的问题,修复后运行截图为:
A3部分总结
keras作为Theano和tensorflow的封装,支持python,模型库全,搭模型快,简单易学 ,官方文档齐全,可以方便快捷的做出小demo,rnn支持的比较全面,各种网络类型,各种网络结构都支持的较好。但是缺点也是很明显,编译慢,难调试,中间变量很难去追踪,观察起来很费力。实验过程就遇到过许多问题,有些问题是numpy的Array格式,还比较解决,但有的直接是底层问题,会直接显示tensorflow的报错问题,额,只能各处google,还不一定能找出解决方案,这个过程是痛苦的,同时也是会想要放弃的阶段。如果想要深入研究深度学习算法,还是推荐学习tensorflow等底层框架,但是如果不想具体了解代码,只是想快速做出Demo,keras还是很舒服的。同时因为keras支持python,所以利用闲暇时间学习python语法,久而久之突然对python有了兴趣,因为之前没有接触过python,目前又在狂补python….
课程学习心得总结
之前有上过孟宁老师的一门高级软件工程课,感受过孟宁老师的授课风格,但相较于软件课程,网络程序设计课程风格更加新颖。不在是传统的填鸭式教学,而是将主动权交还给学生,孟宁老师扮演的更多是引导者的角色。每堂课都会有同学分享交流有关机器学习算法,深度学习框架的知识,再通过老师与学生之间的互动问答,使得我们对知识理解的更加透彻。同时需要进行自我反省的是,很缺乏团队协作的能力和学习交流能力。整个课程中没有和同学们分享交流学习到的东西,没有为项目做出贡献,没有体会到孟宁老师教学的独特之处,仅仅是自我封闭式学习,力度大,收获少,闭门造车的方式对个人的成长将是毁灭的。希望自己在今后的学习中多交流,多思考,多动手解决问题,多珍惜与良师益友的学习的机会
**SA16225112 霍梦翔**