这段话放在前面:之前一种用的Pytorch,用着还挺爽,感觉挺方便的,但是在最近文献的时候,很多实验都是基于Google 的Keras的,所以抽空学了下Keras,学了之后才发现Keras相比Pytorch而言,基于keras来写神经网络的话太方便,因为Keras高度的封装性,所以基于Keras来搭建神经网络很简单,在Keras下,可以用两种两种方法来搭建网络模型,分别是Sequential()与Model(),对于网络结构简单,层次较少的模型使用sequential方法较好,只需不断地model.add即可,而后者更适用于网络模型复杂的情况,各有各的好处。

论GPU的重要性:在未使用GPU之前,一直用的CPU来训练,那速度,简直是龟速,一个VGG16花了10个小时,费时费力还闹心,然后今天将它加载在实验室的服务器上,只花了不到半个小时就好了。

下面给出代码:

  1. #!/usr/bin/env python 3.6
  2. #_*_coding:utf-8 _*_
  3. #@Time    :2019/11/9 15:19
  4. #@Author  :hujinzhou 
  5. #@FileName: My_frist_keras_moudel.py
  6.  
  7. #@Software: PyCharm
  8. from keras.datasets import mnist
  9. from call_back import LossHistory
  10. from keras.utils.np_utils import to_categorical
  11. import numpy as np
  12. import cv2
  13. import pylab
  14. from keras.optimizers import Adam,SGD
  15. from matplotlib import pyplot as plt
  16. from keras.utils.vis_utils import plot_model
  17. from keras.layers import Dense, Activation, Flatten,Convolution2D,MaxPool2D,Dropout,BatchNormalization
  18. from keras.models import Sequential, Model
  19. from keras.layers.normalization import BatchNormalization
  20. np.random.seed(10)
  21. """下载mnist数据集,x_train训练集的数据,y_train训练集的标签,测试集依次类推"""
  22. (x_train,y_train),(x_test,y_test)=mnist.load_data()
  23. print(x_train.shape)
  24. print(len(x_train))
  25. print(y_train[0])
  26. "-----------------------------------------------------------------------------------------"
  27. """通过迭代的方法将训练集中的数据整形为32*32"""
  28. x_train4D = [cv2.cvtColor(cv2.resize(i,(32,32)), cv2.COLOR_GRAY2BGR) for i in x_train]
  29. x_train4D = np.concatenate([arr[np.newaxis] for arr in x_train4D]).astype('float32')
  30.  
  31. x_test4D = [cv2.cvtColor(cv2.resize(i,(32,32)), cv2.COLOR_GRAY2BGR) for i in x_test]
  32. x_test4D = np.concatenate([arr[np.newaxis] for arr in x_test4D]).astype('float32')
  33. print(x_test4D.shape)
  34. print(x_train4D.shape)
  35. "------------------------------------------------------------------------------------"
  36. plt.imshow(x_train4D[0],cmap='gray')
  37. pylab.show()
  38. #x_train4D = x_train4D.astype('float32')
  39. #x_test4D = x_test4D.astype('float32')
  40. """归一化"""
  41. x_test4D_normalize=x_test4D/255
  42. x_train4D_normalize=x_train4D/255
  43.  
  44. """one_hot encoding"""
  45. y_trainOnehot=to_categorical(y_train)
  46. y_testOnehot=to_categorical(y_test)
  47.  
  48. """建立模型"""
  49. "--------------------------------------------------------------------------"
  50. model=Sequential()
  51. model.add(Convolution2D(filters=64,
  52. kernel_size=(5,5),
  53. padding='same',
  54. input_shape=(32,32,3),
  55.  
  56. kernel_initializer='he_normal',
  57. name='cnn1'
  58.  
  59. )
  60. )#output32*32*64
  61. model.add(BatchNormalization(axis=-1))
  62. model.add(Activation('relu'))
  63.  
  64. # model.add(Convolution2D(filters=64,
  65. # kernel_size=(5,5),
  66. # padding='same',
  67. #
  68. # kernel_initializer='he_normal',
  69. # name='cnn2'
  70. # )
  71. # )#output32*32*64
  72. # model.add(BatchNormalization(axis=-1))
  73. # model.add(Activation('relu'))
  74. model.add(MaxPool2D(pool_size=(2,2),strides=(2, 2)))#output16*16*64
  75.  
  76. model.add(Convolution2D(filters=128,
  77. kernel_size=(5,5),
  78. padding='same',
  79.  
  80. kernel_initializer='he_normal',
  81. name='cnn3'
  82. )
  83. )#output16*16*128
  84. model.add(BatchNormalization(axis=-1))
  85. model.add(Activation('relu'))
  86. # model.add(Convolution2D(filters=128,
  87. # kernel_size=(5,5),
  88. # padding='same',
  89. #
  90. # kernel_initializer='he_normal',
  91. # name='cnn4'
  92. # )
  93. # )#output16*16*128
  94. # model.add(BatchNormalization(axis=-1))
  95. # model.add(Activation('relu'))
  96. model.add(MaxPool2D(pool_size=(2,2),strides=(2, 2)))#output8*8*128
  97.  
  98. model.add(Convolution2D(filters=256,
  99. kernel_size=(5,5),
  100. padding='same',
  101.  
  102. kernel_initializer='he_normal',
  103. name='cnn5'
  104. )
  105. )#output8*8*256
  106. model.add(BatchNormalization(axis=-1))
  107. model.add(Activation('relu'))
  108. # model.add(Convolution2D(filters=256,
  109. # kernel_size=(5,5),
  110. # padding='same',
  111. #
  112. # kernel_initializer='he_normal',
  113. # name='cnn6'
  114. # )
  115. # )#output8*8*256
  116. # model.add(BatchNormalization(axis=-1))
  117. # model.add(Activation('relu'))
  118. # model.add(Convolution2D(filters=256,
  119. # kernel_size=(5,5),
  120. # padding='same',
  121. #
  122. # kernel_initializer='he_normal',
  123. # name='cnn7'
  124. # )
  125. # )#output8*8*256
  126. # model.add(BatchNormalization(axis=-1))
  127. # model.add(Activation('relu'))
  128. model.add(MaxPool2D(pool_size=(2,2),strides=(2, 2)))#output4*4*256
  129. model.add(Convolution2D(filters=512,
  130. kernel_size=(5,5),
  131. padding='same',
  132.  
  133. kernel_initializer='he_normal',
  134. name='cnn8'
  135. )
  136. )#output4*4*512
  137. model.add(BatchNormalization(axis=-1))
  138. model.add(Activation('relu'))
  139. # model.add(Convolution2D(filters=512,
  140. # kernel_size=(5,5),
  141. # padding='same',
  142. #
  143. # kernel_initializer='he_normal',
  144. # name='cnn9'
  145. # )
  146. # )#output4*4*512
  147. # model.add(BatchNormalization(axis=-1))
  148. # model.add(Activation('relu'))
  149. # model.add(Convolution2D(filters=512,
  150. # kernel_size=(5,5),
  151. # padding='same',
  152. #
  153. # kernel_initializer='he_normal',
  154. # name='cnn10'
  155. # )
  156. # )#output4*4*512
  157. # model.add(BatchNormalization(axis=-1))
  158. # model.add(Activation('relu'))
  159. model.add(MaxPool2D(pool_size=(2,2),strides=(2, 2)))#output2*2*512
  160. model.add(Convolution2D(filters=512,
  161. kernel_size=(5,5),
  162. padding='same',
  163.  
  164. kernel_initializer='he_normal',
  165. name='cnn11'
  166. )
  167. )#output2*2*512
  168. model.add(BatchNormalization(axis=-1))
  169. model.add(Activation('relu'))
  170. # model.add(Convolution2D(filters=512,
  171. # kernel_size=(5,5),
  172. # padding='same',
  173. #
  174. # kernel_initializer='he_normal',
  175. # name='cnn12'
  176. # )
  177. # )#output2*2*512
  178. # model.add(BatchNormalization(axis=-1))
  179. # model.add(Activation('relu'))
  180. # model.add(Convolution2D(filters=512,
  181. # kernel_size=(5,5),
  182. # padding='same',
  183. #
  184. # kernel_initializer='he_normal',
  185. # name='cnn13'
  186. # )
  187. # )#output2*2*512
  188. # model.add(BatchNormalization(axis=-1))
  189. # model.add(Activation('relu'))
  190. model.add(MaxPool2D(pool_size=(2,2),strides=(2, 2)))#output1*1*512
  191. model.add(Dropout(0.5))
  192. model.add(Flatten())
  193. model.add(Dense(512))
  194. model.add(Activation('relu'))
  195. model.add(Dropout(0.5))
  196. model.add(Dense(10))
  197. model.add(Activation('softmax'))
  198. model.summary()
  199. plot_model(model,to_file='model4.png',show_shapes=True,show_layer_names=True)
  200. # for layer in model.layers:
  201. # layer.trainable=False
  202. "--------------------------------------------------------------------------------"
  203. """训练模型"""
  204. adam=SGD(lr=0.1)
  205. model.compile(optimizer=adam,loss='categorical_crossentropy',metrics=['accuracy'])
  206. epoch=5
  207. batchsize=100
  208. # from keras.models import load_model
  209. # model = load_model('./My_keras_model_weight')
  210. history=model.fit(x=x_train4D_normalize,
  211. y=y_trainOnehot,
  212. epochs=epoch,
  213. batch_size=batchsize,
  214. validation_data=(x_test4D_normalize,y_testOnehot))
  215.  
  216. """保存模型"""
  217. model.save('./My_keras_model2_weight')
  218.  
  219. #model.load('./My_keras_model_weight')
  220. """画出损失曲线"""
  221. training_loss=history.history["loss"]
  222. train_acc=history.history["acc"]
  223. test_loss=history.history["val_loss"]
  224. test_acc=history.history["val_acc"]
  225.  
  226. epoch_count=range(1,len(training_loss)+1)
  227. plt.plot(epoch_count,training_loss,'r--')
  228. plt.plot(epoch_count,test_loss,'b--')
  229. plt.plot(epoch_count,train_acc,'r--')
  230. plt.plot(epoch_count,test_acc,'b--')
  231. plt.legend(["Training_loss","Test_loss","train_acc","test_acc"])
  232. plt.xlabel("Epoch")
  233. plt.ylabel("loss")
  234. plt.show()

结果如下

最终的精度可以达到0.993左右

loss: 0.0261 - acc: 0.9932 - val_loss: 0.0246 - val_acc: 0.9933

基于Keras 的VGG16神经网络模型的Mnist数据集识别并使用GPU加速的更多相关文章

  1. 使用PyTorch构建神经网络模型进行手写识别

    使用PyTorch构建神经网络模型进行手写识别 PyTorch是一种基于Torch库的开源机器学习库,应用于计算机视觉和自然语言处理等应用,本章内容将从安装以及通过Torch构建基础的神经网络,计算梯 ...

  2. 一个简单的TensorFlow可视化MNIST数据集识别程序

    下面是TensorFlow可视化MNIST数据集识别程序,可视化内容是,TensorFlow计算图,表(loss, 直方图, 标准差(stddev)) # -*- coding: utf-8 -*- ...

  3. 【Keras篇】---利用keras改写VGG16经典模型在手写数字识别体中的应用

    一.前述 VGG16是由16层神经网络构成的经典模型,包括多层卷积,多层全连接层,一般我们改写的时候卷积层基本不动,全连接层从后面几层依次向前改写,因为先改参数较小的. 二.具体 1.因为本文中代码需 ...

  4. Keras学习:第一个例子-训练MNIST数据集

    import numpy as npimport gzip import struct import keras as ks import logging from keras.layers impo ...

  5. 吴裕雄--天生自然 python数据分析:基于Keras使用CNN神经网络处理手写数据集

    import pandas as pd import numpy as np import matplotlib.pyplot as plt import matplotlib.image as mp ...

  6. CNN算法解决MNIST数据集识别问题

    网络实现程序如下 import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data # 用于设置将记 ...

  7. Keras学习环境配置-GPU加速版(Ubuntu 16.04 + CUDA8.0 + cuDNN6.0 + Tensorflow)

    本文是个人对Keras深度学习框架配置的总结,不周之处请指出,谢谢! 1. 首先,我们需要安装Ubuntu操作系统(Windows下也行),这里使用Ubuntu16.04版本: 2. 安装好Ubunt ...

  8. 机器学习与Tensorflow(3)—— 机器学习及MNIST数据集分类优化

    一.二次代价函数 1. 形式: 其中,C为代价函数,X表示样本,Y表示实际值,a表示输出值,n为样本总数 2. 利用梯度下降法调整权值参数大小,推导过程如下图所示: 根据结果可得,权重w和偏置b的梯度 ...

  9. Keras结合Keras后端搭建个性化神经网络模型(不用原生Tensorflow)

    Keras是基于Tensorflow等底层张量处理库的高级API库.它帮我们实现了一系列经典的神经网络层(全连接层.卷积层.循环层等),以及简洁的迭代模型的接口,让我们能在模型层面写代码,从而不用仔细 ...

随机推荐

  1. 一篇文章教你如何部署.NET Core WPF应用,你还在等什么?

    DevExpress广泛应用于ECM企业内容管理. 成本管控.进程监督.生产调度,在企业/政务信息化管理中占据一席重要之地.通过DevExpress WPF Controls,您能创建有着强大互动功能 ...

  2. idea 包.路径切换为目录结构

    取消勾选

  3. mybatis+mysql批量插入和批量更新

    一.批量插入 批量插入数据使用的sql语句是: insert into table (字段一,字段二,字段三) values(xx,xx,xx),(oo,oo,oo) mybatis中mapper.x ...

  4. [Javascript] Nested generators

    To see how to call another generator inside a generator: function* numbers () { ; ; yield* moreNumbe ...

  5. .Net Core: 跨域Cros概要

    读取配置 public class AppConfig { public static IConfigurationRoot Configuration { get; set; } public st ...

  6. Material icons 全图标一览

    Material icons 全图标一览 2018年12月17日 16:52:55 boywcx 阅读数 3090   版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog. ...

  7. apt update时出现签名无法验证,公钥失效的解决办法

    错误信息如下 W: GPG error: http://ppa.launchpad.net/ondrej/php/ubuntu xenial InRelease: The following sign ...

  8. java/servlet/jsp 中String与int相互转换

    String ---> int //方式一:Integer(String s) //demo: Integer i = int a = i.intValue() //方式二:static int ...

  9. 三个div并排

    css: .div-inline{ display:inline} html: <div class="div-inline">第一个div盒子</div> ...

  10. Spring Cloud Eureka(六):Eureka Client 如何注册到Eureka Server

    1.本节概要 根据前文我们对Eureka Server 有了一定的了解,本节我们主要学习Eureka Client 与 Eureka Server 如何通讯的及相关通信机制是什么,本文会弄清楚一下几个 ...