请选择 进入手机版 | 继续访问电脑版
设为首页 收藏本站
开启辅助访问 快捷导航
菜单
从零开始 查看内容

深度进修初学者利用Keras构建和摆设CNN模子

2020-7-4 13:07| 发布者: 我叫用户名| 查看: 167| 评论: 3

摘要: 机器学习,神经网络,分类,回归,CNN,TensorFlow,Keras,深度学习等等这些词对你来说并不陌生。互联网充斥着学习机器学习的资源。在过去的几年里,机器学习已经侵入了我们日常生活的各个方面。直接或间接地,有意 ...

机械进修,神经收集,分类,回归,CNN,TensorFlow,Keras,深度进修等等这些词对你来说并不陌生。互联网充溢着进修机械进修的资本。在曩昔的几年里,机械进修已经侵入了我们平常生活的各个方面。间接或间接地,成心或无意地,我们天天都与机械进修算法停止交互。虽然机械进修已经存在了几十年,但比来利用的激增很洪流平上是由于我们现在具有的绝对计较才能。深度进修模子正在云上的高度复杂和强大的硬件系统上停止练习和摆设。

本文将重点先容若何构建一个迷你机械进修项目。目标是让您领会若何构建,培训和摆设自己的机械进修模子。利用风行的MNIST手写数字数据集构建小型卷积神经收集模子并将其摆设在当地计较机上的根基先容。

本教程的焦点是利用Keras构建一个可以识别手写数字的小型CNN模子。我们将利用我们练习有素的模子来识别我们利用鼠标指针在网页上编写的数字。这需要我们利用HTML,Javascript和Flask构建一个小型Web利用法式。可是你可以复制并粘贴该部分的代码,由于我们的首要方针不是建立网站,而是利用Keras建造CNN模子。

构建模子

要起头利用,您可以翻开Windows cmd终端并激活安装了Keras和其他依靠项的Anaconda情况。
activate MyEnvDL

激活情况后,情况称号将显现在cmd终端上,以下所示。在任何您喜好的地方建立一个具有任何称号的新文件夹,然后启动Jupyter笔记本
C:\\Users\\Administrator>mkdir "Keras Deploy"
C:\\Users\\Administrator>cd "Keras Deploy"
C:\\Users\\Administrator\\Keras Deploy>jupyter notebook

深度进修初学者利用Keras构建和摆设CNN模子__2020-7-4 13:07发布_从零开始_167

启动Jupyter Notebook后,依照构建CNN模子。您可以在Jupyter notebook中的分歧单元格中编写下面的每个代码片断。

以下代码导入构建模子所需的必须keras包。它还导入MNIST数据集,该数据集是70k图像的手写数字(0到9)的数据集,每个图像的巨细为28像素×28像素。
import keras
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPooling2D
from keras import backend as K

深度进修初学者利用Keras构建和摆设CNN模子__2020-7-4 13:07发布_从零开始_167

我们将设备一些变量,例如用于反向传布批量巨细的类的数目以及图像的高度和宽度。
batch_size = 128
num_classes = 10
epochs = 12
img_rows = 28
img_cols = 28
x_train, y_train), (x_test, y_test) = mnist.load_data()

深度进修初学者利用Keras构建和摆设CNN模子__2020-7-4 13:07发布_从零开始_167

由于图像的像素值范围为0-255,我们将把它们缩小到0-1的范围。
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
x_train = x_train/255
x_test = x_test/255

深度进修初学者利用Keras构建和摆设CNN模子__2020-7-4 13:07发布_从零开始_167

您可以利用此可选代码检察数据集合的图像。变动x_train的索引以检察分歧的数字。
import matplotlib.pyplot as plt
%matplotlib inline
plt.imshow(x_train[0], cmap=’gray’)

深度进修初学者利用Keras构建和摆设CNN模子__2020-7-4 13:07发布_从零开始_167

下面的代码处置图像输入模子的格式。
if K.image_data_format() == 'channels_first':
x_train = x_train.reshape(x_train.shape[0],1,img_rows,img_cols)
x_test = x_test.reshape(x_test.shape[0],1,img_rows,img_cols)
input_shape = (1, img_rows, img_cols)
else:
x_train = x_train.reshape(x_train.shape[0],img_rows,img_cols,1)
x_test = x_test.reshape(x_test.shape[0],img_rows,img_cols,1)
input_shape = (img_rows, img_cols, 1)

深度进修初学者利用Keras构建和摆设CNN模子__2020-7-4 13:07发布_从零开始_167

以下代码段构建了现实的CNN模子。现在,您将看到Keras供给的模块化功用,可以快速构建和实验模子。
model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3),activation='relu', input_shape=input_shape))
model.add(Conv2D(64, kernel_size=(3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(num_classes, activation='softmax'))

深度进修初学者利用Keras构建和摆设CNN模子__2020-7-4 13:07发布_从零开始_167

如您所见,我们的模子中有几个层。上面代码中的第一行初始化了模子工具。然后利用每个model.add()向您的神经收集增加一层。第一层是卷积层内核或过滤器巨细为 3x3,ReLU激活函数和32个过滤器。然后是另一个卷积层,接着是最大池化层,然后是完全毗连的层。Dropout层是一种正则化技术,用于进步泛化性能。请留意,您可以轻松地在您的模子中将这些层组合在一路
model.compile(loss=keras.losses.categorical_crossentropy, optimizer=keras.optimizers.adam(), metrics=[‘accuracy’])

深度进修初学者利用Keras构建和摆设CNN模子__2020-7-4 13:07发布_从零开始_167

model.compile()设置我们的模子将若何进修。它界说了损失(本钱)函数和用于反向传布的优化算法。编译模子后,您可以看到您构建的神经收集的摘要。
model.summary()
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv2d_1 (Conv2D) (None, 26, 26, 32) 320
_________________________________________________________________
conv2d_2 (Conv2D) (None, 24, 24, 64) 18496
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 12, 12, 64) 0
_________________________________________________________________
dropout_1 (Dropout) (None, 12, 12, 64) 0
_________________________________________________________________
flatten_1 (Flatten) (None, 9216) 0
_________________________________________________________________
dense_1 (Dense) (None, 128) 1179776
_________________________________________________________________
dropout_2 (Dropout) (None, 128) 0
_________________________________________________________________
dense_2 (Dense) (None, 10) 1290
=================================================================
Total params: 1,199,882
Trainable params: 1,199,882
Non-trainable params: 0
_________________________________________________________________

深度进修初学者利用Keras构建和摆设CNN模子__2020-7-4 13:07发布_从零开始_167

请留意,第一个卷积层的输出是26x26而不是28x28。您可以在卷积层中指定添补参数,以连结经过过滤的输出图像与输入图像的巨细不异。另请留意,我们的小型实现中有大约120万个参数。

现在我们已经界说了我们的神经收集架构和我们想要利用的层。是时辰练习我们的模子了:
model.fit(x_train, y_train, batch_size=batch_size, epochs=epochs, verbose=1, validation_data=(x_test, y_test))

深度进修初学者利用Keras构建和摆设CNN模子__2020-7-4 13:07发布_从零开始_167

此号令将需要几分钟才能完成,具体取决于系统的速度。它利用我们之前在model.compile()号令中指定的练习数据和参数以及优化算法来运转反向传布
score = model.evaluate(x_test, y_test, verbose=0)
print('Test loss:', score[0])
print('Test accuracy:', score[1])
Test loss: 0.029761945198223474
Test accuracy: 0.9911

深度进修初学者利用Keras构建和摆设CNN模子__2020-7-4 13:07发布_从零开始_167

我们看到我们的模子精度到达了99.11%,很是好。我们的模子在10,000其中毛病地分类了89个例子。您可以尝试进一步伐整模子以获得更高的精度,可是现在我们将继续停止此操纵并保存模子。
model_json = model.to_json()
with open("model.json", "w") as json_file:
json_file.write(model_json)
model.save_weights("model.h5")

深度进修初学者利用Keras构建和摆设CNN模子__2020-7-4 13:07发布_从零开始_167

我们将在摆设中利用保存的model.json和model.h5文件。到今朝为止,我们已经利用Keras快速实现了一个CNN,并对其停止了练习,并在测试集合停止了测试。现在我们来看看我们的模子能否识别我们写的数字。

摆设模子

正如我们之前所说,本文的目标不是深入领会构建Web利用法式的细节。Web利用法式仅用于说明目标,并检查我们的模子在现实输入情况下的履行情况,最重要的是为了获得一些兴趣!

深度进修初学者利用Keras构建和摆设CNN模子__2020-7-4 13:07发布_从零开始_167

在当前工作区中建立名为flask_deploy的目录
C:\\Users\\Administrator>Keras Deploy>mkdir flask_deploy

深度进修初学者利用Keras构建和摆设CNN模子__2020-7-4 13:07发布_从零开始_167

建立更多目录以保存我们的CNN模子并存储HTML,javascript,CSS和Flask文件。目录结构以下所示。不要担忧文件的内容只是建立具有以下称号的空文件,我们稍后会在其中增加代码。将我们经过Jupyter Notebook保存的keras模子复制到模子目录中。
flask_deploy
|---- model
| |---- model.h5
| |---- model.json
|
|---- static
| |---- index.js
| |---- style.css
|
|---- templates
| |---- index.html
|
|---- keras_flask.py

深度进修初学者利用Keras构建和摆设CNN模子__2020-7-4 13:07发布_从零开始_167

index.js文件中复制以下代码。这处置用户与Web页面的交互。
(function() {
var canvas = document.querySelector("#canvas");
var context = canvas.getContext("2d");
canvas.width = 280;
canvas.height = 280;
var Mouse = { x: 0, y: 0 };
var lastMouse = { x: 0, y: 0 };
context.fillStyle = "black";
context.fillRect(0, 0, canvas.width, canvas.height);
context.color = "white";
context.lineWidth = 15;
context.lineJoin = context.lineCap = "round";
clearCanvas();
canvas.addEventListener( "mousemove",
function(e) {
lastMouse.x = Mouse.x;
lastMouse.y = Mouse.y;
Mouse.x = e.pageX - this.offsetLeft;
Mouse.y = e.pageY - this.offsetTop;
}, false);
canvas.addEventListener("mousedown",
function(e) {
canvas.addEventListener("mousemove", onDraw, false);
}, false);
canvas.addEventListener("mouseup",
function() {
canvas.removeEventListener("mousemove", onDraw, false);
}, false);
/* Canvas Draw */
var onDraw = function() {
context.lineWidth = context.lineWidth;
context.lineJoin = "round";
context.lineCap = "round";
context.strokeStyle = context.color;
context.beginPath();
context.moveTo(lastMouse.x, lastMouse.y);
context.lineTo(Mouse.x, Mouse.y);
context.closePath();
context.stroke();
};
/* This function clears the box */
function clearCanvas() {
var clearButton = $("#clearButton");
clearButton.on("click", function() {
context.clearRect(0, 0, 280, 280);
context.fillStyle = "black";
context.fillRect(0, 0, canvas.width, canvas.height);
});
/* Slider control */
var slider = document.getElementById("myRange");
var output = document.getElementById("sliderValue");
output.innerHTML = slider.value;
slider.oninput = function() {
output.innerHTML = this.value;
context.lineWidth = $(this).val();
};
$("#lineWidth").change(function() {
context.lineWidth = $(this).val();
});
}})();

深度进修初学者利用Keras构建和摆设CNN模子__2020-7-4 13:07发布_从零开始_167

index.html文件中复制以下代码。这是我们Web页面的根基结构及其内部的元素,如绘图框,滑块和按钮。

MNIST Handwritten text recognition using keras


MNIST Handwritten CNN

Draw the digit inside this Box

Drag the slider to change the line width.

Value:

Predict
Clear

Get your prediction here!!!

Keras MNIST




鲜花

握手

雷人

路过

鸡蛋