2016网络程序设计总结

来源:互联网 发布:社交网络电影 编辑:程序博客网 时间:2024/05/16 14:07

一 课程简介

1.1 课程简介 

这门课是中科大软件学院秋季下学期开设的课程,课程名称为网络程序设计,但实际内容主要为神经网络,授课教师为 孟宁老师(介绍)

1.2 课程收获 

上这门课之前对于神经网络和Python完全没接触过,但是通过短短2个月的学习对于神经网络和Python能力有了非常大的提升。如果你也对这两方面感兴趣又苦于基础不够,我的学习经历可能对你产生一些帮助。

二 初识神经网络     -- A1 手写字符串的神经网络识别 实验链接

2.1   实验效果

图片


在浏览器上20*20矩阵画出字符,让神经网络识别出数字

2.2   理论支撑

2.2.1原理

当用户在一个20*20的矩阵上写下一个阿拉伯数字后,通过神经网络的训练,便可预测出字符。用于手写识别的一个神经网络,有一组输入神经元。输入神经元会被输入图像的数据所激发。在激励值被加权并通过一个函数后,这些神经元的激励值被传递到其他神经元。这个过程不断重复,直到输出神经元被激发。最后,输出神经元的激励值决定了识别出来的是哪个数字。最开始看见这段话也是不断挠头,完全不能理解,看完下面这些东西会帮助你理解实验一和神经网络工作流程。

2.2.2 神经网络概念

人工神经网络(人工神经网络)的计算模型灵感来自动物的中枢神经系统(尤其是脑),并且被用于估计或可以依赖于大量的输入和一般的未知近似函数。人工神经网络通常呈现为相互连接的“神经元”,它可以从输入的计算值,并且能够机器学习以及模式识别由于它们的自适应性质的系统。人工神经网络的最大优势是他们能够被用作一个任意函数逼近的机制,那是从观测到的数据“学习”。然而,使用起来也不是那么简单的,一个比较好理解的基本理论是必不可少的。可以理解为解决一个问题,需要一个数学模型,神经网络在理论上可以模仿任何数学模型的,在人们搭建好一个神经网络的时候不断用数据去训练神经网络,最终这个网络会向理想中的数学模型靠拢。然而神经网络的参数调试并不是线性的,因此一个好的神经网络基本模型的搭建需要很大的精力去调整参数。

2.2.3神经网络工作原理



shenjingyuan

用与非门的方式来表示单个神经元,通过0.1基本输入输出基本上可以表示任何复杂数学模型。

shenjingwangluo

图片矩阵为20*20 则输入层为400个节点,输出数字为0到9这输出层为10个节点。在预测时输出层节点数值最高的数字,即为预测数字。

2.2.4 激励函数

在人工神经网络中,单个神经元的输入与输出之间的函数关系叫做激励函数,在神经网络中最经典的激励函数Sigmoid函数图像如下所示,它可以描述输入和输出之间最微小变化的关系,但是sigmoid函数也有自己的缺陷就是在x取接近极限值得时变化并不明显,在x很大或很小时无法客观描述输入和输出的关系。

hanshu

2.2.5 BP算法

BP算法的基本思想是,学习过程由信号的正向传播与误差的反向传播两个过程组成。正向传播时,输入样本从输入层传入,经各隐层逐层处理后,传向输出层。若输出层的实际输出与期望的输出(教师信号)不符,则转入误差的反向传播阶段。误差反传是将输出误差以某种形式通过隐层向输入层逐层反传,并将误差分摊给各层的所有单元,从而获得各层单元的误差信号,此误差信号即作为修正各单元权值的依据。这种信号正向传播与误差反向传播的各层权值调整过程,是周而复始地进行的。权值不断调整的过程,也就是网络的学习训练过程。此过程一直进行到网络输出的误差减少到可接受的程度,或进行到预先设定的学习次数为止。BP算法的局限性

1)易形成局部极小(属贪婪算法,局部最优)而得不到全局最优;
2)训练次数多使得学习效率低下,收敛速度慢(需做大量运算);
3)隐节点的选取缺乏理论支持;
4)训练时学习新样本有遗忘旧样本趋势。
   111

2.3   核心代码

在实验楼中给了详细的所有代码,只要一步一步按照要求执行下来就好,执行实验环境很重要大哭(python版本,Ubuntu版本,第三方库的版本)。

2.4   实验收获

实验一做完就已经对神经网络基本概念,工作原理,工作流程有所了解,虽然有的公式算法在今天看起来很简单,但是这是很多数学家花了很多年的时间才提炼出的公式。做完第一个项目,神经网络对于初学者就已经不再是一个模糊概念,而是一个非常好用的数学模型了。

做完实验一虽然不需要写代码,但是想要做好实验一阅读python代码必不可少。但是Python代码真是出奇的简单易懂,第三库又极其强大!!!基础Python知识掌握!

心得:项目驱动,自学在先,课堂分享,果然学起东西好快。deadline的力量是无穷的!

三 项目轮廓初显    -- A2 血常规检验报告的图像ocr识别

3.1   实验效果

tupian

3.2   理论支撑


a)高斯平滑

img_gb= cv2.GaussianBlur(img_gray, (gb_param, gb_param), 0)

b)腐蚀、膨胀

closed =cv2.morphologyEx(img_gb, cv2.MORPH_CLOSE, kernel)

opened =cv2.morphologyEx(closed, cv2.MORPH_OPEN, kernel)

线段检测

为了对图片各个数值所在的区域进行定位,这里需要检测出图片中比较明显的标识,3条黑线,然后利用这三条线对整张图片进行标定。主要用到了以下3个步骤:

a)Canny边缘检测

edges= cv2.Canny(opened, canny_param_lower , canny_param_upper)

b)轮廓提取

contours,hierarchy = cv2.findContours(edges, cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

c)求最小外接矩形

def getbox(i):

            rect = cv2.minAreaRect(contours[i])

            box = cv2.cv.BoxPoints(rect)

            box = np.int0(box)

           return box


3.3   核心代码

import osfrom flask import Flask, request, Response, render_templatefrom werkzeug.utils import secure_filenamefrom pymongo import MongoClientimport bson.binaryfrom cStringIO import StringIOfrom PIL import Imageapp = Flask(__name__)# 读取配置文件app.config.from_object('config')# 连接数据库,并获取数据库对象db = MongoClient(app.config['DB_HOST'], app.config['DB_PORT']).testdef save_file(f):content = StringIO(f.read())try:mime = Image.open(content).format.lower()if mime not in app.config['ALLOWED_EXTENSIONS']:raise IOError()except IOError:flask.abort(400)c = dict(content=bson.binary.Binary(content.getvalue()),filename=secure_filename(f.filename), mime=mime)db.files.save(c)return c['_id'], c['filename']@app.route('/', methods=['GET', 'POST'])def index():return render_template("upload.html")@app.route('/upload', methods=['POST'])def upload():if request.method == 'POST':if 'file' not in request.files:flash('No file part')return render_template("error.html", errormessage="No file part")file = request.files['file']if file.filename == '':flash('No selected file')return render_template("error.html", errormessage="No selected file")if file:# 保存到mongodbfid, filename= save_file(file)print(fid)return render_template("result.html", filename=filename, fileid=fid)return render_template("error.html", errormessage="No POST methods")@app.route('/file/<fid>')def find_file(fid):try:file = db.files.find_one(bson.objectid.ObjectId(fid))if file is None:raise bson.errors.InvalidId()return Response(file['content'], mimetype='image/' + file['mime'])except bson.errors.InvalidId:flask.abort(404)if __name__ == '__main__':    app.run(host=app.config['SERVER_HOST'],port=app.config['SERVER_PORT'])

flask web服务器后台代码


3.4   实验收获

这部分和神经网络实验关系不大。但是确使用了Python 做web程序非常火的一个轻量级框架FLASK和特别火的数据库mongodb,对于Python编程能力有进一步的提高。之前对于图形图像完全没有接触过,但是通过这次实验同学的分享也了解了图像的基本知识和简单的处理方法收获很大。

四 神经网络的进阶--A1项目的再次实现

4.1  实验任务   通过第三方框架实现自己的A1项目的神经网络功能


4.2  实验收获   这个实验比较简单,今年大火的tensorflow框架官方文档给的范例1就是手写字符串识别,只需要注意好版本号,运行即可。可以初步了解tensorflow框架的运行原理。官方链接


五  搭建自己的神经网络 -- A4 血常规检验数据报告预测年龄和性别

5.1   实验效果

ps

pa

5.2   理论支撑

keras库 介绍

Keras 是一个兼容 Theano 和 Tensorflow 的神经网络高级包, 用他来组件一个神经网络更加快速, 几条语句就搞定了. 而且广泛的兼容性能使 Keras 在 Windows 和 MacOS 或者 Linux 上运行无阻碍.

keras搭建各种神经网络实例

model = Sequential()# build a LSTM RNNmodel.add(LSTM(    batch_input_shape=(BATCH_SIZE, TIME_STEPS, INPUT_SIZE),       # Or: input_dim=INPUT_SIZE, input_length=TIME_STEPS,    output_dim=CELL_SIZE,    return_sequences=True,      # True: output at all steps. False: output as last step.    stateful=True,              # True: the final state of batch1 is feed into the initial state of batch2))# add output layermodel.add(TimeDistributed(Dense(OUTPUT_SIZE)))adam = Adam(LR)model.compile(optimizer=adam,              loss='mse',)

                                                LSTM

model = Sequential()# Conv layer 1 output shape (32, 28, 28)model.add(Convolution2D(    nb_filter=32,    nb_row=5,    nb_col=5,    border_mode='same',     # Padding method    dim_ordering='th',      # if use tensorflow, to set the input dimension order to theano ("th") style, but you can change it.    input_shape=(1,         # channels                 28, 28,)    # height & width))model.add(Activation('relu'))
model.add(MaxPooling2D(    pool_size=(2, 2),    strides=(2, 2),    border_mode='same',    # Padding method))
# Conv layer 2 output shape (64, 14, 14)model.add(Convolution2D(64, 5, 5, border_mode='same'))model.add(Activation('relu'))# Pooling layer 2 (max pooling) output shape (64, 7, 7)model.add(MaxPooling2D(pool_size=(2, 2), border_mode='same'))
# Fully connected layer 1 input shape (64 * 7 * 7) = (3136), output shape (1024)model.add(Flatten())model.add(Dense(1024))model.add(Activation('relu'))
# Fully connected layer 2 to shape (10) for 10 classesmodel.add(Dense(10))model.add(Activation('softmax'))


               CNN

model = Sequential()model.add(SimpleRNN(

# for batch_input_shape, if using tensorflow as the backend, we have to put None for the batch_size. # Otherwise, model.evaluate() will get error. batch_input_shape=(None, TIME_STEPS, INPUT_SIZE), # Or: input_dim=INPUT_SIZE, input_length=TIME_STEPS, output_dim=CELL_SIZE, unroll=True,))
# output layermodel.add(Dense(OUTPUT_SIZE))model.add(Activation('softmax'))
for step in range(4001):    # data shape = (batch_num, steps, inputs/outputs)    X_batch = X_train[BATCH_INDEX: BATCH_INDEX+BATCH_SIZE, :, :]    Y_batch = y_train[BATCH_INDEX: BATCH_INDEX+BATCH_SIZE, :]    cost = model.train_on_batch(X_batch, Y_batch)    BATCH_INDEX += BATCH_SIZE    BATCH_INDEX = 0 if BATCH_INDEX >= X_train.shape[0] else BATCH_INDEX    if step % 500 == 0:        cost, accuracy = model.evaluate(X_test, y_test, batch_size=y_test.shape[0], verbose=False)        print('test cost: ', cost, 'test accuracy: ', accuracy)




              RNN

5.3   核心代码

# the data, shuffled and split between train and test sets(X_train, y_train), (X_test, y_test) = my_load.load_data()#训练集和测试集转化为矩阵X_train = X_train.reshape(1858, 26)X_test = X_test.reshape(200, 26)#对训练和测试数据处理,转为floatX_train = X_train.astype('float32')X_test = X_test.astype('float32')#对数据进行归一化到0-1 因为样本中血液检查指标数据最大是180X_train /= 180X_test /= 180'''print(X_train.shape[0], 'train samples')print(X_test.shape[0], 'test samples')'''# 将标签进行转换为唯一标志Y_train = np_utils.to_categorical(y_train, output)Y_test = np_utils.to_categorical(y_test, output)model = Sequential()#输入层,输入维度26,输出维度16.第一层必须填写,后续层可以自动推导model.add(Dense(16, input_shape=(26,)))model.add(Activation('relu'))model.add(Dropout(0.1))#隐藏层1model.add(Dense(output_dim=256))model.add(Activation('relu'))model.add(Dropout(0.2))#隐藏层2model.add(Dense(output_dim=100))model.add(Activation('relu'))model.add(Dropout(0.2))#输出层 ,Softmax分类,输出是10类model.add(Dense(output_dim=10))model.add(Activation('softmax'))adagrad=Adagrad(lr=0.02, epsilon=1e-4)#model.compile编译接受3个参数 loss(损失函数就是目标函数), optimizer(优化器),model.compile(loss='categorical_crossentropy',              optimizer=adagrad,              metrics=['accuracy'])#model.fit接受6个参数,训练数据,标签,每个batch包含的样本数,训练轮数,是否打乱,日志显示(0不输出日志信息,1输出进度条,2每轮训练输出一条记录),是否显示精确度,选择作为验证集的比例history = model.fit(X_train, Y_train,                    batch_size, nb_epoch,                    verbose=2, validation_data=(X_test, Y_test))'''result = []result = model.predict_classes(X_test,batch_size=128,verbose=0)for r in result:   print r'''score = model.evaluate(X_test, Y_test, verbose=2)printprint score[1]
预测年龄的keras版神经网络代码


# the data, shuffled and split between train and test sets(X_train, y_train), (X_test, y_test) = myload.load_data()#训练集和测试集转化为矩阵X_train = X_train.reshape(1858, 26)X_test = X_test.reshape(200, 26)#对训练和测试数据处理,转为floatX_train = X_train.astype('float32')X_test = X_test.astype('float32')#对数据进行归一化到0-1 因为样本中血液检查指标数据最大是180X_train /= 180X_test /= 180# 将标签进行转换为唯一标志Y_train = np_utils.to_categorical(y_train, nb_classes)Y_test = np_utils.to_categorical(y_test, nb_classes)#搭建网络model = Sequential()#输入层,输入维度26,输出维度32.第一层必须填写,后续层可以自动推导model.add(Dense(32, input_shape=(26,)))model.add(Activation('relu'))model.add(Dropout(0.5))#隐藏层1model.add(Dense(output_dim=32))model.add(Activation('relu'))model.add(Dropout(0.5))#隐藏层2model.add(Dense(output_dim=17))model.add(Activation('relu'))model.add(Dropout(0.5))#输出层 ,Softmax分类,输出是2类model.add(Dense(output_dim=2))model.add(Activation('softmax'))#model.compile编译接受3个参数 loss(损失函数就是目标函数), optimizer(优化器),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)for r in result:    print r'''score = model.evaluate(X_test, Y_test, verbose=1)print('Test accuracy:', score[1])print "end"
预测性别的keras版神经网络代码

5.4   实验收获

终于在keras搭积木大法帮助下,搭建和训练了自己的神经网络,并且用它做出了预测。再次对于神经网络的工作原理和方法,Python编程能力对比几周前已经有了质的提高。但是也出现暴露了几个问题,1)对于神经网络的工作原理并没有深入理解,调节层数和节点时陷入玄学,一个一个试过去。还需要多读几篇论文深入了解下工作原理 2)数理知识还是不够用,对于keras库封装好的各种激励函数,loss函数,优化函数并没有理解透彻。

但是上到这里收获很多了,在孟老师的督导下对于神经网络和Python的能力进步的飞快,果然项目驱动学东西才是快。按照传统方式及其可能会陷入在某个公式或Python语法中,然而对于神经网络本身确没有什么了解,缺少了纵观全局的本事。

六 项目合并

6.1 项目效果

555

666

666


七 课堂之外--完课感言

7.1 教学方式

孟老师的一直以来都不是以填鸭式教学方式为主,而是分享式教学+git多人编码协同合作+项目驱动+课程群24讨论

多种方式相结合的。虽然这门课课程压力很大,但可以充分调动同学们的积极性,彼此分享间学到很多知识共同进步。

孟老师为这课也付出了很多心血可以看到孟老师在周末,在深夜在凌晨都会在群里和同学讨论问题,管理git仓库,是一位

十分认真努力的水平很高好老师。

(慕课网上有孟老师的课程视频,感兴趣的同学可以一睹孟老师的风姿大笑

7.2 课外活动

这门课不仅能在课程上学到东西,孟老师也会给学生一些去线下会议的机会。让我们切身了解到目前的行业发展状况

为以后实习和工作做好准备,避免出现空有屠龙之技却没龙的尴尬。孟老师说AI发展到现在已经不再是大公司的专利

小公司也可以做,以后人才缺口会很大。再次希望呈孟老师吉言,以后能在深度学习领域有自己的发展。感谢孟老师

本学期的谆谆教诲!

会议1



0 0