零基础从20K到25K的深度学习之路--3 用keras做一个回归模型

用keras做一个回归模型

摘要:这是一个系列的文章,讲述了一个工程师从零自学深度学习的过程。希望能和大家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 用好就行了。

    通过下面简单的两句话,我们就建好了房子的框架。

 

[Python] 纯文本查看 复制代码

?

1

2

[/p][p=26, null, left]from keras.models import Sequential

models = Sequential()[/p][p=26, null, left]

 

    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.

     怎么做?

[Python] 纯文本查看 复制代码

?

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

[/size][/font]

[font=Consolas, &quot][size=12px]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

 

[/size][/font]

[font=Consolas, &quot][size=12px]#step2 用keras建了一个房子,构建了一个模型

model = Sequential()[/size][/font]

[font=Consolas, &quot][size=12px]

#step3 用keras添加了家具,咱们就用了一层网络全连接网络dense

model.add(Dense(input_dim=1, output_dim=1, init='uniform', activation='linear'))[/size][/font]

[font=Consolas, &quot][size=12px]

#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[/size][/font]

[font=Consolas, &quot][size=12px]

#step5 训练咱们的模型,给模型‘喂’入咱们的训练数据

model.compile(optimizer='sgd', loss='mse')

model.fit(trX, trY, nb_epoch=200, verbose=1)[/size][/font]

[font=Consolas, &quot][size=12px]

#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是不一样的,会有浮动,这是正常的。[/size][/font]

 

[font=Consolas, &quot][size=12px]#####################################################################################################################################################[/size][/font]

[font=Consolas, &quot][size=12px]# 咱们可以看看模型学到的weighs和bias和通过数据分析得到的weighs和bias是否一致,然后就是模型优化的过程[/size][/font]

[font=Consolas, &quot][size=12px]#####################################################################################################################################################[/size][/font]

 

[font=Consolas, &quot][size=12px]#step7 保存咱们的模型。为啥要保存?因为模型是不断优化的过程,我们获取了更多的数据之后,可以用新的数据再去训练模型[/size][/font]

[font=Consolas, &quot][size=12px]#      让模型学到更多东西[/size][/font]

[font=Consolas, Bitstream Vera Sans Mono, Courier New, Courier, monospace][size=12px]model.save_weights("my_model.h5")[/size][/font]

[font=Consolas, Bitstream Vera Sans Mono, Courier New, Courier, monospace][size=12px]

[/size][/font]

[font=Consolas, Bitstream Vera Sans Mono, Courier New, Courier, monospace][size=12px]#step8 把原来保存的模型再调出来,继续训练。[/size][/font]

[font=Consolas, Bitstream Vera Sans Mono, Courier New, Courier, monospace][size=12px]model.load_weights('my_model_weights.h5')[/size][/font]

[font=Consolas, &quot][size=12px]

 

结尾:这个例子我们模拟了一个线性回归,这个线性回归可能用于件量预测场景。哈哈,虽然简单,但是确是入门的一个好例子。

最后分享一个顺丰内推:

亲爱的小伙伴们,顺丰科技内推内推,大数据算法与策略部,部门内大部分是国外名校硕博,国内211,985,招java开发,python开发,数据分析,大数据开发,机器学习等。基本要求,统招本科两年经验。技术特别牛的忽略。地点深圳。请先加入顺丰内推群扣扣858317035。简历直接发我扣扣邮箱,谢谢。

老铁们,快快加入

我还会不定期分享自己的学习视频和教程,大家一起努力。先定个小目标,30k

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值