摘要:这是一个系列的文章,讲述了一个工程师从零自学深度学习的过程。希望能和大家100小时入门深度学习,然后慢慢积累10000小时成为大师。用深度学习做一个回归模型,用于做预测。
1.什么是回归?
啥是回归?用听不懂的语言说,回归是一种数学模型,然后xxxxxxx
然后用我的话说,现在有个x,还有个y,y和x有一种关系,咱们先来个简单的例子。y=3x+2,这也是一种回归,
只不过是那种比较简单的回归,线性模型回归。这种线性模型回归有啥用?
比如对于我现在在顺丰,可能会有这样一个情景,可能某个地方人越多,那么件量就会多,这可能就是一种最简单的回归关系。
然后我们就可以用回归来做预测。假如y是件量,x是人数,而且我们通过机器学习,发现y和x存在y=3x+2的关系,那么只要
我们知道了有多少人,然后是不是就可以做件量预测,是不是就可以预测会有多少件量,从而更深层的做一些人力资源排班啥的。
这就是一个简单的应用场景。
2.需要什么基本的keras基础知识?
2.1 先建房子,构建keras的model
keras中最主要的数据结构式model,咱们可以理解为房子的框架。有了这个房子架构之后,咱们在往里面添家具,做更复杂的事情。
keras有两种方式建造model,一种是Sequential model,这种model很简单,就像打游戏通关一样,咱们要做的仅仅是增加关卡一样。
另外一种方式是高级API,这种是用来做一些更加复杂的模型,比如多输出模型等等。现在暂时不用管,咱们先把Sequential 用好就行了。
通过下面简单的两句话,我们就建好了房子的框架。
from keras.models import Sequential
models = Sequential()
2.2 建好房子,再往里面添家具(keras的图层的概念)
怎么理解图层?这就是得去恶补一下卷积神经网络的概念了。
深度学习模型肯定包括输入层,输出层,还有中间一个隐藏层,只不过模型越复杂,中间那个隐藏层就越多,越难。
咱们初学者可以把这些图层理解为我们如何发现x和y存在关系的一个过程。
常用的图层有卷积层、MaxPooling 层、全连接层、Dropout、扁平层。
今天的线性回归模型只用到全连接dense层。
2.3 数据输入
深度学习的第一层是输入层,需要将训练数据读进去,所以这一层必须制定输入数据的维度input_shape
model.add(Conv2D(32, (3,3), activation='relu', input_shape=(224, 224, 3)))
比如这里我们就构建了一个卷积层,输入数据的大小是224*224*3
模型创建好了,我们要用优化器和损失函数。
model.compile(loss='binary_crossentropy', optimizer='rmsprop')
机器学习初级工程师有一个很重要的工作就是调参,俗称‘调包侠’。怎么理解?
上面的损失函数和优化器其实有很多很多中,都是牛逼的人做好的。
有时候我们的模型用优化器A效果要由于优化器B,不同的优化器在不同的场景下效果是不同的。
这就需要不断地尝试,才能发现规律,从而晋级成为资深的机器学习工程师。
2.4 模型训练
模型构建完成了以后,我们要把训练的数据输入给模型,在keras中是通过fit来完成,
我们要把训练数据‘喂’给我们的模型,让它从训练数据里面学到规律。
model.fit(x_train, y_train, batch_size = 32, epochs = 10, validation_data(x_val, y_val))
2.5 评估模型
模型创建好了,也训练好了。怎么看咱们的这个模型效果好不好?
那当然要去验证了。俗话说‘时间是检验真理的唯一标准’,我们要用另外一部分数据去验证模型。
因为通常情况下我们的模型是要接受未知数据的检验,所以最开始的时候训练数据就要和测试数据区分开。
在keras里面咱们用evaluate函数来测试模型的性能。
score = model.evaluate(x_test, y_test, batch_size = 32)
通过得分我们能看到咱们做的模型到底行不行。通过不断调参数,让咱们的模型得分更高,这就是一个不断迭代优化的过程了。
3.怎么实现一个线性回归的深度学习模型?
就像上面说的,咱们要做一个件量预测模型。x代表人数,y代表件量。咱们通过某种途径知道y和x存在这样一个线性回归关系,
y=3x+2。这里我们可以通过对数据分析啥的知道y和x可能存在这种关系。现在我们要做一个模型,让模型学到weighs=3,bias=2,我们输入x,
模型会反馈出一个y,这个y=weighs*x+bias.
怎么做?
[mw_shl_code=python,true]
import keras
from keras.models import Sequential
from keras.layers import Dense
import numpy as np
# step1 准备输入数据
# trX代表从-1到1,一共有101个点。这里可以理解为我们有很多这样的数据,有个城市A有x个人,有y个件量。
# 这就是我们保存的历史数据。我们模型如何学到weighs和bias,都是基于这些历史数据,它们会发现内部存在的规律。
# trY代表和trX存在线性回归关系的件量数据。因为我们知道件量和人数存在这种关系,所以我们知道一个人数x,对应于一个这样的件量y
# np.random.randn(*trX.shape)这个代表啥?噪音!因为在真实情况下,很少有y和x存在这么赤裸裸的关系,一般会有点点偏差。
# 比如我们历史数据中x=100,y可能不等于302,可能是303,或者301,会有一定的浮动。整体趋势是y=3x+2这样的一根直线,但是会存在轻微浮动。
trX = np.linspace(-1, 1, 101)
trY = 3 * trX + np.random.randn(*trX.shape) * 0.33+2
#step2 用keras建了一个房子,构建了一个模型
model = Sequential()
#step3 用keras添加了家具,咱们就用了一层网络全连接网络dense
model.add(Dense(input_dim=1, output_dim=1, init='uniform', activation='linear'))
#step4 看看模型没有训练前能得到啥weighs和bias
weights = model.layers[0].get_weights()
w_init = weights[0][0][0]
b_init = weights[1][0]
print('Linear regression model is initialized with weights w: %.2f, b: %.2f' % (w_init, b_init))
## Linear regression model is initialized with weight w: -0.03, b: 0.00
## 可以看到这里没有喂入训练数据之前,它的weighs和bias是一个随便的初始化的值
## 咱们希望模型能学到weighs=3,bias=2
#step5 训练咱们的模型,给模型‘喂’入咱们的训练数据
model.compile(optimizer='sgd', loss='mse')
model.fit(trX, trY, nb_epoch=200, verbose=1)
#step6 模型训练完以后,咱们看看模型能不能学到weighs=3,bias=2.
weights = model.layers[0].get_weights()
w_final = weights[0][0][0]
b_final = weights[1][0]
print('Linear regression model is trained to have weight w: %.2f, b: %.2f' % (w_final, b_final))
##Linear regression model is trained to have weight w: 2.94, b: 2.08
## 可以看到这里模型学到了weighs=2.94,bias=2.08。已经非常接近咱们的标准值3和2了。
## 各位老铁请注意,可能每次跑出来的模型学到的weighs和bias是不一样的,会有浮动,这是正常的。
#####################################################################################################################################################
# 咱们可以看看模型学到的weighs和bias和通过数据分析得到的weighs和bias是否一致,然后就是模型优化的过程
#####################################################################################################################################################
#step7 保存咱们的模型。为啥要保存?因为模型是不断优化的过程,我们获取了更多的数据之后,可以用新的数据再去训练模型
# 让模型学到更多东西
model.save_weights("my_model.h5")
#step8 把原来保存的模型再调出来,继续训练。
model.load_weights('my_model_weights.h5')
[/mw_shl_code]
结尾:这个例子我们模拟了一个线性回归,这个线性回归可能用于件量预测场景。哈哈,虽然简单,但是确是入门的一个好例子。
最后分享一个顺丰内推:
亲爱的小伙伴们,顺丰科技内推内推,大数据算法与策略部,部门内大部分是国外名校硕博,国内211,985,招java开发,python开发,数据分析,大数据开发,机器学习等。基本要求,统招本科两年经验。技术特别牛的忽略。地点深圳。请先加入顺丰内推群扣扣858317035。简历直接发我扣扣邮箱,谢谢。
老铁们,快快加入
我还会不定期分享自己的学习视频和教程,大家一起努力。先定个小目标,30k