深度学习笔记(一)DNN-在mnist数据集上用keras搭建dnn

本文代码运行的环境为:

  • ubuntu 16.04 64
  • cuda=9.0
  • cudnn=7.0.5
  • tensorflow=1.12.0
  • python=3.6.4(anaconda 3.5.1)

本文包含的知识点有:

  • Keras简介
  • Keras使用Sequential序列模型
  • Keras模型可视化
  • Keras模型编译运行
  • Keras模型保存与加载

1. Keras 简介

Keras 是一个用于构建和训练深度学习模型的高阶 API。它可用于快速设计原型、高级研究和生产。当我们有一些新的想法时,可以借助keras快速实现。tensorflow1.x是支持keras高层API的,内置于TensorFlow的Keras版本在原先的基础上增加了具有TensorFlow特定的增强功能。所以文章中的代码都是基于tensorflow内置keras实现的。
这里需要说明为什么使用tf 1.x而不是最新的2.0中的keras。目前tf 2.0中的keras和1.x中的keras可以做到一定程度兼容。但是tensorflow2.0吧,感觉不太稳定;另外不怕被人笑话,像我这种面向开源项目编程的选手,需要用到了2.0版本的代码时,才会去学2.0。所以本文中代码全是在1.x环境实现的。

2. Keras实现dnn手写数据的识别

2.1 数据加载和参数定义

import numpy as np
from tensorflow.keras.datasets import mnist
from tensorflow.keras.utils import to_categorical, plot_model
from tensorflow.keras.models import Sequential, load_model
from tensorflow.keras.layers import Dense, Dropout
from tensorflow.keras.optimizers import SGD, Adam
from tensorflow.keras.regularizers import l2

# load data and configure parameters

x_dim = 28*28
num_classes = 10
batch_size = 50
epochs=10

(x_train, y_train), (x_test, y_test) = mnist.load_data()
# reshape and normalize x
x_train = x_train.reshape(x_train.shape[0], -1)
x_test = x_test.reshape(x_test.shape[0], -1)
# convert y to one-hot form
y_train = to_categorical(y_train, num_classes=num_classes)
y_test = to_categorical(y_test, num_classes=num_classes)

这一步没啥好说的,首先导包,定义参数和加载数据。这里

mnist.load_data()

将mnist数据分为60000张训练集和10000张测试集,没有我们tensorflow版本中所说的验证集,不过无关紧要,想设计验证机可以自己分嘛。

to_categorical

这个函数将label值转为one-hot稀疏编码形式,方便后面的调用。细节不再赘述,这些函数不明白的话调到源码看一下就懂了。

2.2 定义模型

# define model
model = Sequential()
model.add(Dense(units=256, input_dim=x_dim, use_bias=True, activation='relu', name='dense1'))
#model.add(Dropout(rate=0.5))
model.add(Dense(units=128, input_dim=256, use_bias=True, activation='tanh'))
#model.add(Dropout(rate=0.5))
model.add(Dense(units=num_classes, input_dim=128, use_bias=True, activation='softmax'))

这里我们定义了一个三层的dnn模型,关于dnn层数的数法可以看深度学习笔记-DNN-tensorflow手写数字识别的介绍。首先看下

Sequential()是一个序贯模型,是函数式模型的简略版.它是最简单的线性、从头到尾的结构顺序,不分叉,是多个网络层的线性堆叠.通过mode.add()向一个Sequential中堆叠许多层,可以构建出深度神经网络.model.add()增加模型层数.Dense()设定模型结构.这里我们可以把:

model.add(Dense(units=256, input_dim=x_dim, activation='relu'))

写成:

model.add(Dense(units=256, input_dim=x_dim))
model.add(Activation('relu'))

其实无所谓的,不过这样写,模型的可视化结构会发生改变.让我们看下如何可视化模型.

2.3 可视化模型

2.3.1 plot_model可视化模型
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
plot_model(model, to_file='model.png', show_shapes=True, show_layer_names=True)
img = mpimg.imread('model.png')
plt.imshow(img)
plt.axis('off')
plt.show()

通过plot_model将模型画出来,会有以下效果:
plot_model可视化模型

2.3.2 summary可视化模型
model.summary()

使用model.summary()或者print(model.summary())可以在控制台打印出模型的概况,如图所示:
summary可视化模型
我们通过可视化可以在训练前检查模型是否正确搭建.下面看下训练过程.

2.4 模型编译与运行

编译模型,运行模型然后保存模型:

model.compile(optimizer=Adam(lr=0.001), loss='categorical_crossentropy', metrics=['accuracy'])
model.fit(x_train, y_train, batch_size=batch_size, epochs=epochs)
model.save('model/dnn.h5')

网络模型搭建完后,需要对网络的学习过程进行编译,否则在调用 fit 或 evaluate 时会抛出异常。这里compile编译过程主要是对学习过程进行参数配置.其中优化器我们使用Adam优化器,损失函数选择交叉熵损失,测试指标为准确率accuracy.训练结束后使用model.save()保存模型.
Keras是高层API,我们可以发现Keras的训练代码很短.高层API简洁,但是通常都比较慢.有兴趣可以运行tensorflow版本的Mnist分类,比这个快很多.

2.5 测试

加载模型然后测试数据:

model = load_model('model/dnn.h5')
loss, acc = model.evaluate(x_test, y_test, verbose=1)
print('Loss:', loss, 'Acc:', acc)

运行结果如下:
训练结果
model.save不仅可以保存模型的参数,还可以保存模型的结构.我们可以直接用load_model加载别人训练好的模型,它可以"无中生有"一个模型出来.而另一种保存模型的方法model.save_weights只能保存模型权重,用的时候需要load_weights方法加载权重,并且在加载权重前,模型结构必须已经定义好,而且定义好的模型的结构(包括层的名称)必须与要加载的一致.

参考:

https://blog.csdn.net/xxiaobaib/article/details/90457032
https://www.jianshu.com/p/6aa40d99fc9e
https://www.cnblogs.com/weiyinfu/p/9788179.html
https://github.com/wyl6/Deep-Learning-Codes-Repository

最后

完整代码:https://github.com/wyl6/Deep-Learning/tree/master/dnn/keras_mnist

更多精彩内容请关注公众号:推荐算法工程师

公众号分享博主的推荐系统学习经验和心得,欢迎交流

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
搭建一个DNN(Deep Neural Network)网络,可以使用Python中的深度学习框架,如TensorFlow或PyTorch等。以下是一个简单的DNN网络的搭建过程: 1. 导入必要的库和数据 ```python import tensorflow as tf import numpy as np # 加载训练和测试数据 (train_data, train_labels), (test_data, test_labels) = tf.keras.datasets.mnist.load_data() ``` 2. 数据预处理 ```python # 数据预处理 train_data = train_data.astype(np.float32) / 255.0 test_data = test_data.astype(np.float32) / 255.0 # 将标签转换为独热编码 train_labels = tf.keras.utils.to_categorical(train_labels, 10) test_labels = tf.keras.utils.to_categorical(test_labels, 10) # 将数据转换为张量 train_data = tf.convert_to_tensor(train_data) train_labels = tf.convert_to_tensor(train_labels) test_data = tf.convert_to_tensor(test_data) test_labels = tf.convert_to_tensor(test_labels) ``` 3. 定义模型 ```python # 定义模型 model = tf.keras.Sequential([ tf.keras.layers.Flatten(input_shape=(28, 28)), tf.keras.layers.Dense(128, activation='relu'), tf.keras.layers.Dropout(0.2), tf.keras.layers.Dense(10, activation='softmax') ]) ``` 4. 编译模型 ```python # 编译模型 model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy']) ``` 5. 训练模型 ```python # 训练模型 model.fit(train_data, train_labels, epochs=10, validation_data=(test_data, test_labels)) ``` 6. 评估模型 ```python # 评估模型 test_loss, test_acc = model.evaluate(test_data, test_labels, verbose=2) print('\nTest accuracy:', test_acc) ``` 以上是一个简单的DNN网络的搭建过程。你可以根据自己的数据和需求来调整模型结构和参数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值