关闭

2016网络程序设计:机器学习 总结

标签: 机器学习
126人阅读 评论(0) 收藏 举报
分类:


项目心得

一直以来习惯于老师在台上一味的灌输讲课,而作为学生的我们,在课堂下被动的接受,时常左耳听右耳冒的教学模式。【网络程序设计】让我对研究生的课程有不一样的认识,也庆幸能够领会孟宁老师不一样的教学风格。在这学期的课堂上没有具体的内容,完全依靠实践、自学、查阅文档来领悟技术。相对比其他课程的PPT模式,这对我不仅是动手能力动脑能力的提高,也让我真正有兴趣参与到整个项目的进行中,不仅使我受益匪浅,而且提升自我技术能力。

在整体的学习过程中,关于以下几点是我受益匪浅的。

关于技术方面:
机器学习对我来说是一个新的知识,从没有接触过的,以及python语言更是了解的少之又少。所以在整个项目进程中,根据老师的每一个分解步骤一步步跟进实验进程。逐步理解加深机器学习知识 。
A1项目中,能够基于BP神经网络实现了一个简单的手写字符识别系统,理解了整个机器学习的过程(实现客户端/服务器端,构建神经网络,完成神经网络设计脚本)并且能够简单的识别数字。
A2项目中,能够跟进项目,实现血培养报告单中OCR识别。主要难点是识别区域的锁定和剪裁,找准血培养报告的统一基准线,通过该表图片的灰度、锐化,进行精准的图片处理工作。并将结果存放到mongoDB数据库。
A3项目中,是整个项目的核心内容,在A2图片处理完毕的基础上,能够进行数据的训练和预测任务。使用Keras库进行最终年龄性别的预测。

关于项目方面:
团队合作:通过每个同学对项目的研究,以及在课堂上的精彩分享,我知道了团队合作的重要性,一个项目的整体进程,不仅是每个人的贡献,而且是团体的协作能力。在老师引导下,每个同学根据自己的特长邻域进行技术分享,使我能够不仅仅是局限于机器学习的某一个方面,而且能够获得他人的技术成果。使得学习的过程轻松愉快 ,也令我对于机器学习的认识有更多方面的理解。
代码规范:之所以能够顺利的掌握机器学习的知识,并且快速准确的推进项目的实现,和文档规范是密不可分的。对于代码的详细注释,使得我能够更加准确的立即每段代码的含义,通俗易懂

整体学习过程中,我接触到了许多以前从未触碰过的知识。这门课不仅仅是一门实践的课,而是理论与实践结合十分紧密的课,随着项目推进的过程,我们要不断的学习机器算法的相关知识,深度学习开源库的使用,并将学到的知识运用到具体的课程项目中。老师作为整体项目的指引着,让我能够有清晰的思路完成整个项目的学习过程,减少走弯路的时间和精力,令我收获颇丰。

虽然对整体的项目没有过多的贡献,但是在跟紧实验的过程中,我会努力要求自己知晓每段代码的含义,深入理解机器学习,令我更主动的学习新的知识,而不是退缩回避,为我以后的学习发展提供了更广阔的方向。

项目目标

2016年下半学期的神经网络程序设计,是通过深度学习神经网络等机器学习技术实现一个医学辅助诊断的专家系统原型,目前仅针对医院血常规检测报告进行OCR识别,并且通过OCR识别的数据,进行患者性别、年龄的预测。课程重点是分析神经网络,掌握常用的算法。

项目安排

分为三个阶段

  • A1a 神经网络实现手写字符识别系统
  • A2 血常规检验报告的图像OCR识别
  • A3 根据血常规检验的各项数据预测年龄和性别

项目链接

  • 项目地址 :整体的课程安排及项目标准的展示页面,其中,BloodTestReportOCR文件夹为项目的主要代码,DigitRecogn为手写字符集识别程序代码。
  • CODE地址 :在码市中展示项目的所有代码及整体思路

项目详情

项目运行环境

# 安装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

#安装pandas和 scikit-learn
sudo apt-get install python-numpy cython python-scipy python-matplotlib
pip install -U scikit-learn(如果不行就加sudo)
pip install pandas

项目1:A1a 神经网络实现手写字符识别系统

梗概:基于BP神经网络实现一个手写字符识别系统,系统会在服务器启动时自动读入训练好的神经网络文件,如果文件不存在,则读入数据集开始训练,用户可以通过在html页面上手写数字发送给服务器来得到识别结果。

学习笔记:这个项目是机器学习最基本的识别内容,一共分为三个层次:输入层,隐藏层,输出层。输入层共400个像素点,即400行一列的矩阵。其中着色部分为1,否则为0。输出为10行一列的one-hot矩阵。采用反向传播算法计算误差率,系统根据误差改变网络的权值矩阵和偏置向量并进行训练。

效果图:
这里写图片描述

项目2:A2 血常规检验报告的图像OCR识别

梗概:主要目的是通过对血常规报告单的锁定、剪裁。进行OCR识别

由于图片识别后,得到的一个json数据存储到了mongodb数据库得到一个OID,并且json数据能够自动识别不同旋转角度的图片,并且截取所需要的区域,所以只需要对图片进行处理分析,来修正由于倾斜透视角度不同使得处理效果不佳的问题。

主要方法通过预处理识别进行图片分析。
需要处理的文件

预处理:图片的对比度、锐化处理,对原图片进行处理,描述出大致形状,通过基准线进行剪裁

预处理文件

识别:识别结果页面,上部是原始图片,下部是一个显示识别数据的表格,以便对照识别结果
识别后文件

项目3: A3 根据血常规检验的各项数据预测年龄和性别

主要通过Keras库来进行数据的训练和最终的性别,年龄的预测
http://blog.csdn.net/lyy14011305/article/details/53377359

代码Demo

关于keras库

根据其他同学关于keras库的整合,借鉴了其中的方法:

  • Keras库的一共有三层网络,每一层有32个结点
  • Relu激活函数可以防止过拟合,按照20%来 dropout 数据
  • Categorical_crossentropy:损失函数,预测性别、年龄,找出函数最小值
  • RMSprop():优化函数,并且使用其自定义值
    SGD(lr=0.05, decay=1e-6, momentum=0.9,nesterov=True)
    具体代码如下:
(X_train, y_train), (X_test, y_test) = load_data()
X_train = X_train.reshape(1858, 26)
X_test = X_test.reshape(200, 26)
X_train = X_train.astype('float32')
X_test = X_test.astype('float32')
X_train /= 255
X_test /= 255
print(X_train.shape[0], 'train samples')
print(X_test.shape[0], 'test samples')
# convert class vectors to 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()
model.add(Dense(32, input_shape=(26,)))
model.add(Activation('relu'))
model.add(Dropout(0.2))
model.add(Dense(output_dim=32))
model.add(Activation('relu'))
model.add(Dropout(0.2))
model.add(Dense(output_dim=20))
model.add(Activation('softmax'))
sgd = SGD(lr=0.05, decay=1e-6, momentum=0.9, nesterov=True)
#model.compile(loss='categorical_crossentropy',optimizer=RMSprop(),metrics=['accuracy'])
model.compile(loss='categorical_crossentropy',optimizer=sgd,metrics=['accuracy'])
history = model.fit(X_train, Y_train,batch_size=batch_size, 
                    nb_epoch=nb_epoch,verbose=1, 
                    validation_data=(X_test, Y_test))
预测性别/年龄代码如下
# -*- 预测年龄/性别代码 -*-  
# 性别是2分类 年龄是10分类
age = 10
gender = 2
#修改这个地方可以选择预测性别还是年龄
#但年龄的准确率不忍直视
test_what = gender
#数据的分组边界
splitor=1400
# 准备数据
age_orign = []
data_orign = []
sex_orign = []
with open('train.csv','rb') as precsv:
    reader = csv.reader(precsv)
    for line in reader:
        # 忽略第一行
        if reader.line_num == 1:
            continue
        if(line[1] == '\xc4\xd0'):
            sex_orign.append(0) # 性别数据
        else:
            sex_orign.append(1) 
        age_orign.append(int(float(line[2])/10)) # 年龄(按照10岁为一个阶段分组)
        data_orign.append(line[4:]) # 血检数据
将数据分为训练集和测试集
age_train = np.array(age_orign[:splitor])
data_train = np.array(data_orign[:splitor])
sex_train = np.array(sex_orign[:splitor])
age_predict = np.array(age_orign[splitor:])
data_predict = np.array(data_orign[splitor:])
sex_predict = np.array(sex_orign[splitor:])
数据的维度(数据含有多少项)

data_dim = data_train.shape[1]
if test_what == age:
    XT =  data_train.reshape(-1,data_dim,1,1)
    YT =  np_utils.to_categorical(age_train,nb_classes=age)
    XT2 =  data_predict.reshape(-1,data_dim,1,1)
    YT2 =  np_utils.to_categorical(age_predict,nb_classes=age)
    output_dim = age
    loss_str = 'categorical_crossentropy'
else:
    XT =  data_train.reshape(-1,data_dim,1,1)
    YT =  np_utils.to_categorical(sex_train,nb_classes=gender)
    XT2 =  data_predict.reshape(-1,data_dim,1,1)
    YT2 =  np_utils.to_categorical(sex_predict,nb_classes=gender)
    output_dim = gender
    loss_str = 'binary_crossentropy'
#
model = Sequential()
# 
model.add( Convolution2D( 
    nb_filter=data_dim*data_dim, 
    nb_row=5, 
    nb_col=5,
    border_mode='same',
    input_shape=(data_dim,1,1) 
    ))
model.add(Activation('relu'))
# pooling
model.add( MaxPooling2D(
    pool_size=(2,2),
    strides=(2,2),
    border_mode='same'   
    ))

model.add( Convolution2D(64,5,5,border_mode='same'))
model.add( Flatten())
model.add( Dense(1024) )
#model.add( Activation('relu'))
model.add( Activation('relu'))
model.add(Dense(output_dim))
model.add( Activation('softmax'))
adam = Adam(lr=0.0001)
model.compile(
    loss=loss_str,
    optimizer=adam,
    metrics=['accuracy']
    )
model.fit(XT,YT,nb_epoch=100,batch_size=32)

print '===='    
loss,accuracy = model.evaluate(XT2,YT2)
print loss
print accuracy
最终效果
  • 上传需要预测的血培养报告图片

这里写图片描述
“`

  • 选择血培养图片,并提交

这里写图片描述

  • 得到血培养报告单数值

这里写图片描述

  • 得到预测结果

这里写图片描述

至此,年龄预测完毕

0
1

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:126次
    • 积分:12
    • 等级:
    • 排名:千里之外
    • 原创:1篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档