使用Keras建立模型并训练等一系列操作方式

由于Keras是一种建立在已有深度学习框架上的二次框架,其使用起来非常方便,其后端实现有两种方法,theano和tensorflow。由于自己平时用tensorflow,所以选择后端用tensorflow的Keras,代码写起来更加方便。

1、建立模型

Keras分为两种不同的建模方式,

Sequential models:这种方法用于实现一些简单的模型。你只需要向一些存在的模型中添加层就行了。

Functional API:Keras的API是非常强大的,你可以利用这些API来构造更加复杂的模型,比如多输出模型,有向无环图等等。

这里采用sequential models方法。

构建序列模型。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

def define_model():

  model = Sequential()

  # setup first conv layer

  model.add(Conv2D(32, (3, 3), activation="relu",

           input_shape=(120, 120, 3), padding='same')) # [10, 120, 120, 32]

  # setup first maxpooling layer

  model.add(MaxPooling2D(pool_size=(2, 2))) # [10, 60, 60, 32]

  # setup second conv layer

  model.add(Conv2D(8, kernel_size=(3, 3), activation="relu",

           padding='same')) # [10, 60, 60, 8]

  # setup second maxpooling layer

  model.add(MaxPooling2D(pool_size=(3, 3))) # [10, 20, 20, 8]

  # add bianping layer, 3200 = 20 * 20 * 8

  model.add(Flatten()) # [10, 3200]

  # add first full connection layer

  model.add(Dense(512, activation='sigmoid')) # [10, 512]

  # add dropout layer

  model.add(Dropout(0.5))

  # add second full connection layer

  model.add(Dense(4, activation='softmax')) # [10, 4]

  return model

可以看到定义模型时输出的网络结构。

2、准备数据

1

2

3

4

5

6

7

8

9

10

11

12

13

14

def load_data(resultpath):

  datapath = os.path.join(resultpath, "data10_4.npz")

  if os.path.exists(datapath):

    data = np.load(datapath)

    X, Y = data["X"], data["Y"]

  else:

    X = np.array(np.arange(432000)).reshape(10, 120, 120, 3)

    Y = [0, 0, 1, 1, 2, 2, 3, 3, 2, 0]

    X = X.astype('float32')

    Y = np_utils.to_categorical(Y, 4)

    np.savez(datapath, X=X, Y=Y)

    print('Saved dataset to dataset.npz.')

  print('X_shape:{}\nY_shape:{}'.format(X.shape, Y.shape))

  return X, Y

3、训练模型

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

def train_model(resultpath):

  model = define_model()

  # if want to use SGD, first define sgd, then set optimizer=sgd

  sgd = SGD(lr=0.001, decay=1e-6, momentum=0, nesterov=True)

  # select loss\optimizer\

  model.compile(loss=categorical_crossentropy,

         optimizer=Adam(), metrics=['accuracy'])

  model.summary()

  # draw the model structure

  plot_model(model, show_shapes=True,

        to_file=os.path.join(resultpath, 'model.png'))

  # load data

  X, Y = load_data(resultpath)

  # split train and test data

  X_train, X_test, Y_train, Y_test = train_test_split(

    X, Y, test_size=0.2, random_state=2)

  # input data to model and train

  history = model.fit(X_train, Y_train, batch_size=2, epochs=10,

            validation_data=(X_test, Y_test), verbose=1, shuffle=True)

  # evaluate the model

  loss, acc = model.evaluate(X_test, Y_test, verbose=0)

  print('Test loss:', loss)

  print('Test accuracy:', acc)

可以看到训练时输出的日志。因为是随机数据,没有意义,这里训练的结果不必计较,只是练习而已。

保存下来的模型结构:

4、保存与加载模型并测试

有两种保存方式

4.1 直接保存模型h5

保存:

1

2

3

4

5

6

def my_save_model(resultpath):

  model = train_model(resultpath)

  # the first way to save model

  model.save(os.path.join(resultpath, 'my_model.h5'))

加载:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

def my_load_model(resultpath):

  # test data

  X = np.array(np.arange(86400)).reshape(2, 120, 120, 3)

  Y = [0, 1]

  X = X.astype('float32')

  Y = np_utils.to_categorical(Y, 4)

  # the first way of load model

  model2 = load_model(os.path.join(resultpath, 'my_model.h5'))

  model2.compile(loss=categorical_crossentropy,

         optimizer=Adam(), metrics=['accuracy'])

  test_loss, test_acc = model2.evaluate(X, Y, verbose=0)

  print('Test loss:', test_loss)

  print('Test accuracy:', test_acc)

  y = model2.predict_classes(X)

  print("predicct is: ", y)

4.2 分别保存网络结构和权重

保存:

1

2

3

4

5

6

7

8

def my_save_model(resultpath):

  model = train_model(resultpath)

  # the secon way : save trained network structure and weights

  model_json = model.to_json()

  open(os.path.join(resultpath, 'my_model_structure.json'), 'w').write(model_json)

  model.save_weights(os.path.join(resultpath, 'my_model_weights.hd5'))

加载:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

def my_load_model(resultpath):

  # test data

  X = np.array(np.arange(86400)).reshape(2, 120, 120, 3)

  Y = [0, 1]

  X = X.astype('float32')

  Y = np_utils.to_categorical(Y, 4)

  # the second way : load model structure and weights

  model = model_from_json(open(os.path.join(resultpath, 'my_model_structure.json')).read())

  model.load_weights(os.path.join(resultpath, 'my_model_weights.hd5'))

  model.compile(loss=categorical_crossentropy,

         optimizer=Adam(), metrics=['accuracy'])

  test_loss, test_acc = model.evaluate(X, Y, verbose=0)

  print('Test loss:', test_loss)

  print('Test accuracy:', test_acc)

  y = model.predict_classes(X)

  print("predicct is: ", y)

可以看到,两次的结果是一样的。

5、完整代码

1

2

3

4

5

6

7

8

9

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

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

from keras.models import Sequential

from keras.layers import Dense, Conv2D, MaxPooling2D, Flatten, Dropout

from keras.losses import categorical_crossentropy

from keras.optimizers import Adam

from keras.utils.vis_utils import plot_model

from keras.optimizers import SGD

from keras.models import model_from_json

from keras.models import load_model

from keras.utils import np_utils

import numpy as np

import os

from sklearn.model_selection import train_test_split

def load_data(resultpath):

  datapath = os.path.join(resultpath, "data10_4.npz")

  if os.path.exists(datapath):

    data = np.load(datapath)

    X, Y = data["X"], data["Y"]

  else:

    X = np.array(np.arange(432000)).reshape(10, 120, 120, 3)

    Y = [0, 0, 1, 1, 2, 2, 3, 3, 2, 0]

    X = X.astype('float32')

    Y = np_utils.to_categorical(Y, 4)

    np.savez(datapath, X=X, Y=Y)

    print('Saved dataset to dataset.npz.')

  print('X_shape:{}\nY_shape:{}'.format(X.shape, Y.shape))

  return X, Y

def define_model():

  model = Sequential()

  # setup first conv layer

  model.add(Conv2D(32, (3, 3), activation="relu",

           input_shape=(120, 120, 3), padding='same')) # [10, 120, 120, 32]

  # setup first maxpooling layer

  model.add(MaxPooling2D(pool_size=(2, 2))) # [10, 60, 60, 32]

  # setup second conv layer

  model.add(Conv2D(8, kernel_size=(3, 3), activation="relu",

           padding='same')) # [10, 60, 60, 8]

  # setup second maxpooling layer

  model.add(MaxPooling2D(pool_size=(3, 3))) # [10, 20, 20, 8]

  # add bianping layer, 3200 = 20 * 20 * 8

  model.add(Flatten()) # [10, 3200]

  # add first full connection layer

  model.add(Dense(512, activation='sigmoid')) # [10, 512]

  # add dropout layer

  model.add(Dropout(0.5))

  # add second full connection layer

  model.add(Dense(4, activation='softmax')) # [10, 4]

  return model

def train_model(resultpath):

  model = define_model()

  # if want to use SGD, first define sgd, then set optimizer=sgd

  sgd = SGD(lr=0.001, decay=1e-6, momentum=0, nesterov=True)

  # select loss\optimizer\

  model.compile(loss=categorical_crossentropy,

         optimizer=Adam(), metrics=['accuracy'])

  model.summary()

  # draw the model structure

  plot_model(model, show_shapes=True,

        to_file=os.path.join(resultpath, 'model.png'))

  # load data

  X, Y = load_data(resultpath)

  # split train and test data

  X_train, X_test, Y_train, Y_test = train_test_split(

    X, Y, test_size=0.2, random_state=2)

  # input data to model and train

  history = model.fit(X_train, Y_train, batch_size=2, epochs=10,

            validation_data=(X_test, Y_test), verbose=1, shuffle=True)

  # evaluate the model

  loss, acc = model.evaluate(X_test, Y_test, verbose=0)

  print('Test loss:', loss)

  print('Test accuracy:', acc)

  return model

def my_save_model(resultpath):

  model = train_model(resultpath)

  # the first way to save model

  model.save(os.path.join(resultpath, 'my_model.h5'))

  # the secon way : save trained network structure and weights

  model_json = model.to_json()

  open(os.path.join(resultpath, 'my_model_structure.json'), 'w').write(model_json)

  model.save_weights(os.path.join(resultpath, 'my_model_weights.hd5'))

def my_load_model(resultpath):

  # test data

  X = np.array(np.arange(86400)).reshape(2, 120, 120, 3)

  Y = [0, 1]

  X = X.astype('float32')

  Y = np_utils.to_categorical(Y, 4)

  # the first way of load model

  model2 = load_model(os.path.join(resultpath, 'my_model.h5'))

  model2.compile(loss=categorical_crossentropy,

          optimizer=Adam(), metrics=['accuracy'])

  test_loss, test_acc = model2.evaluate(X, Y, verbose=0)

  print('Test loss:', test_loss)

  print('Test accuracy:', test_acc)

  y = model2.predict_classes(X)

  print("predicct is: ", y)

  # the second way : load model structure and weights

  model = model_from_json(open(os.path.join(resultpath, 'my_model_structure.json')).read())

  model.load_weights(os.path.join(resultpath, 'my_model_weights.hd5'))

  model.compile(loss=categorical_crossentropy,

         optimizer=Adam(), metrics=['accuracy'])

  test_loss, test_acc = model.evaluate(X, Y, verbose=0)

  print('Test loss:', test_loss)

  print('Test accuracy:', test_acc)

  y = model.predict_classes(X)

  print("predicct is: ", y)

def main():

  resultpath = "result"

  #train_model(resultpath)

  #my_save_model(resultpath)

  my_load_model(resultpath)

if __name__ == "__main__":

  main()

以上这篇使用Keras建立模型并训练等一系列操作方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/121704.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

玩转Apipost-Helper:代码编辑器内调试、生成文档

Apipost-Helper是由Apipost推出的IDEA插件,写完接口可以进行快速调试,且支持搜索接口、根据method跳转接口,还支持生成标准的API文档,注意:这些操作都可以在代码编辑器内独立完成,非常好用!这里…

SSM之spring注解式缓存redis

&#x1f3ac; 艳艳耶✌️&#xff1a;个人主页 &#x1f525; 个人专栏 &#xff1a;《Spring与Mybatis集成整合》《Vue.js使用》 ⛺️ 越努力 &#xff0c;越幸运。 1.Redis与SSM的整合 1.1.添加Redis依赖 在Maven中添加Redis的依赖 <redis.version>2.9.0</redis.…

axios请求的问题

本来不想记录&#xff0c;但是实在没有办法&#xff0c;因为总是会出现post请求&#xff0c;后台接收不到数据的情况,还是记录一下如何的解决的比较好。 但是我使用export const addPsiPurOrder data > request.post(/psi/psiPurOrder/add, data); 下面是封装的代码。后台接…

kubernetes (k8s)的使用

一、kubernetes 简介 谷歌2014年开源的管理工具项目&#xff0c;简化微服务的开发和部署。 提供功能&#xff1a;自愈和自动伸缩、调度和发布、调用链监控、配置管理、Metrics监控、日志监控、弹性和容错、API管理、服务安全等。官网&#xff1a;https://kubernetes.io/zh-cn…

算法记录|笔试中遇到的题

栈 394. 字符串解码730.统计不同回文子序列 394. 字符串解码 我自己写的方法 class Solution {public String decodeString(String s) {char[] chs s.toCharArray();LinkedList<Character> stack new LinkedList<>();for(char ch:chs){if(ch]){stack helper(st…

微信管理系统:让企业更轻松地管理客户和员工资源

在日常工作中&#xff0c;我们经常遇到以下问题&#xff1a; ①由于微信号众多&#xff0c;需要频繁地在不同设备之间切换&#xff0c;这严重影响了工作效率。 ②尽管我一直努力回复客户的消息&#xff0c;但有时还是无法做到即时回复&#xff0c;这给客户带来了一些不便。 …

fpga时序相关概念与理解

一、基本概念理解 对于数字系统而言&#xff0c;建立时间&#xff08;setup time&#xff09;和保持时间&#xff08;hold time&#xff09;是数字电路时序的基础。数字电路系统的稳定性&#xff0c;基本取决于时序是否满足建立时间和保持时间。 建立时间Tsu&#xff1a;触发器…

基于BP神经网络+Adaboost的强分类器设计实现公司财务预警

大家好&#xff0c;我是带我去滑雪&#xff01; Adaboost算法的思想是合并多个弱分类器的输出以产生有效分类。其主要步骤是先利用弱学习算法进行迭代运算&#xff0c;每次运算都按照分类结果更新训练数据权重分布&#xff0c;对于分类失败的训练个体赋予较大的权重&#xff0c…

HCIA-单臂路由-VLAN-VLAN间通信-OSPF 小型实验

HCIA-单臂路由-VLAN-VLAN间通信-OSPF 实验拓扑配置步骤第一步 配置二层VLAN第二步 配置VLANIF和IP地址第三步 配置OSPF 配置验证PC1可以ping通PC2 PC3 PC4 实验拓扑 配置步骤 第一步 配置二层VLAN 第二步 配置VLANIF和IP地址 第三步 配置OSPF 第一步 配置二层VLAN SW1 sysna…

Blender vs 3ds Max:谁才是3D软件的未来

在不断发展的3D建模和动画领域&#xff0c;两大软件巨头Blender和3ds Max一直在争夺顶级地位。 随着技术的进步和用户需求的演变&#xff0c;一个重要问题逐渐浮出水面&#xff1a;Blender是否最终会取代3ds Max&#xff1f;本文将深入探讨二者各自的优势和劣势、当前状况&…

SpringMVC使用AOP监听方法推送数据

导入aop的maven依赖 <dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.6.12</version> </dependency>创建一个spring的XML文件编写aop配置 <?xml version"1.0" …

pytest+yaml实现接口自动化框架

前言 httprunner 用 yaml 文件实现接口自动化框架很好用&#xff0c;最近在看 pytest 框架&#xff0c;于是参考 httprunner的用例格式&#xff0c;写了一个差不多的 pytest 版的简易框架 项目结构设计 项目结构完全符合 pytest 的项目结构&#xff0c;pytest 是查找 test_.…

【ARM Coresight OpenOCD 系列 1 -- OpenOCD 介绍】

请阅读【ARM Coresight SoC-400/SoC-600 专栏导读】 文章目录 1.1 OpenOCD 介绍1.1.1 OpenOCD 支持的JTAG 适配器1.1.2 OpenOCD 支持的调试设备1.1.3 OpenOCD 支持的 Flash 驱动 1.2 OpenOCD 安装与使用1.2.1 OpenOCD 代码获取及安装1.2.2 OpenOCD 使用1.2.3 OpenOCD 启用 GDB…

互联网金融风控常见知识点

1.怎么做互联网金融风控 首先风险不是都是坏的&#xff0c;风险是有价值的。也就是风险的VaR值(Value at Risk) 对于互联网信贷风控&#xff0c;是要把风险和收益做到更合理的平衡&#xff0c;在控制风险水平的情况下使得收益更高。 所以&#xff0c;做风控的不是一味地追求耕…

【C++进阶】继承

​&#x1f47b;内容专栏&#xff1a; C/C编程 &#x1f428;本文概括&#xff1a; 继承的概念与定义、基类与派生类对象赋值转换、继承中的作用域、派生类的默认成员函数、继承与友元、继承与静态成员、菱形继承与虚继承、继承的总结与反思。 &#x1f43c;本文作者&#xff1…

企业办理CCRC需要多少费用?

近几年&#xff0c;很多企业都在咨询了解CCRC认证&#xff0c;各企业对于办理CCRC资质认证最在意的一个环节就是办理的费用&#xff0c;也有不少企业都在咨询同邦信息科技的小编费用的问题&#xff0c;那今天同邦信息科技的小编就给大家说一下 先来给大家科普一下CCRC认证&…

跨境电商源码独立开发:一次购买,终生使用

随着全球电子商务的快速发展&#xff0c;越来越多的企业开始涉足跨境电商领域。为了在这个竞争激烈的市场中脱颖而出&#xff0c;您需要一个专业的跨境电商解决方案。我们的团队为您提供最优质的源码独立开发服务&#xff0c;让您拥有一个功能强大、安全稳定的跨境电商平台。 一…

web3案例中解决交易所中 ETH与token都是0问题 并帮助确认展示是否成功

可能写了这么久 很多人会发现一个问 我们前面的案例 个人在交易所中的 自定义token 和 ETH 一直是放了个0 大家也不太敢确认是否真的有效 那么 很简单 我们操作 存入一些进交易所 不就ok了 我们 来看之前交易所写的代码 我们写了 depositEther 存入 ETH 和 depositToken 存入…

Kotlin(十) 空指针检查、字符串内嵌表达式以及函数默认值

空指针检查 我们在之前的章节里&#xff0c;有定义一个Study的类&#xff0c;它有两个函数&#xff0c;一个doHomework(),一个readBooks()。然后我们定义个doStudy函数&#xff0c;来调用它们&#xff0c;代码如下&#xff1a; fun doStudy(study: Study) {study.doHomework(…

数字化时代,数据分析的基础是什么?

数字化产品和服务覆盖了社会的方方面面&#xff0c;也让数据成为了构建现代化社会的核心元素&#xff0c;让人们明白数据不只是人类活动产生的附加品&#xff0c;还能够在应用过程中促进人类活动发展、优化和改变&#xff0c;真正成为了个人、机构、企业乃至国家的新型资产&…