【Day 23】深度学习实作 --- "Hello world"

今天使用的toolkit是Keras,使用的资料集是MNIST的data,而Keras提供了自动下载MNIST data的function

今天要实作一个最基本的Fully connected feedforward Network,做的是手写数字辨识,用这个范例来当作我们深度学习的"Hello world"。

步骤一:定义一个模型

举例来说,我们要建一个Network的Structure,它的输入是一张解析度是28x28的图片,而我们把它拉直变成一个28x28维的向量,中间有两个hidden layer,然後每一个layer都有500个Neuron,最後输出是10维的向量,分别对应0~9的数字。

首先要先宣告一个model。

model = sequential()

接着要把第一个hidden layer加进去,就使用"add"指令,而後面加了一个"Dense"的意思是你加的是一个Fully connected的layer,"input_dim"就是要设定输入的维度是多少,"units"是代表你的Neuron有几个,最後是"activation",就是你要使用什麽Activation function。

model.add(Dense(input_dim=28 * 28, units=500, activation='relu'))

再加入第二个layer,这时候就不用再宣告输入的维度了,因为第二个layer的输入维度就是前一个layer的unit,不需要再定义一次,所以你只需要再宣告第二个layer会有多少个unit。

model.add(Dense(units=500, activation='relu'))

而最後一个layer,因为输出要是10个数字,所以最後一个layer的输出一定要是10维,所以unit就设10,然後Activation function我们通常会用softmax,使用softmax意味着输出的每一个维度的值都会介於0~1之间且总和是1,就可以当作是机率来看待。

model.add(Dense(units=10, activation='softmax'))

步骤二:评估函式的好坏

接下来我们要评估一个function的好坏。

使用"compile",定义你的Loss function

model.compile(loss='categorical_crossentropy',
              optimizer='adam',
              metrics=['accuracy'])

步骤三:找到最好的函式

在训练之前你要先给一些Configuration告诉它你训练的时候要怎麽做,所以你第一个要给的东西是optimizer,也就是说,你要找最好的function的时候,你要用什麽样的方式来找到最好的function。虽然这边optimizer的後面可以接不同的方式,但是这些方式其实都是基於Gradient Descent的方法,只是有一些方法是机器会自动决定Learning rate的值。

model.compile(loss='categorical_crossentropy',
              optimizer='adam',
              metrics=['accuracy'])

接着你就可以开始训练你的Network,使用"fit",就可以用Gradient Descent来训练你的Network,其中要给它你的训练资料的输入还有Label,"x_train"代表图片,"y_train"代表Label,然後再设定Batch size以及Epochs的大小。

model.fit(x_train, y_train, batch_size=100, epochs=20)

训练好之後,你要拿这个model来做评估,意思就是说你实际上有测试资料的label,你只是想要知道你model在测试资料的表现如何,那就使用"evaluation",只要把测试资料的图片跟Label给它,它就会帮你计算你的model的正确率。而它会输出一个二维的向量,第一个维度会是在测试资料上的Loss,第二个维度是在测试资料上的Accuracy。

result_train = model.evaluate(x_train, y_train)
result_test = model.evaluate(x_test, y_test)
print('Train Acc:', result_train[1])
print('Test Acc:', result_test[1])

那有可能你是要做预测,意思是说你没有正确答案,你要去预测它的结果是多少,所以就使用"predict"并给它测试的图片。

result = model.predict(x_test)

Code

import numpy as np
from keras.models import Sequential
from keras.layers.core import Dense, Dropout, Activation
from keras.layers import Conv2D, MaxPooling2D, Flatten
from keras.optimizers import SGD, Adam
from keras.utils import np_utils
from keras.datasets import mnist


def load_data():  # categorical_crossentropy
    (x_train, y_train), (x_test, y_test) = mnist.load_data()
    number = 10000
    x_train = x_train[0:number]
    y_train = y_train[0:number]
    x_train = x_train.reshape(number, 28 * 28)
    x_test = x_test.reshape(x_test.shape[0], 28 * 28)
    x_train = x_train.astype('float32')
    x_test = x_test.astype('float32')
    # convert class vectors to binary class matrices
    y_train = np_utils.to_categorical(y_train, 10)
    y_test = np_utils.to_categorical(y_test, 10)
    x_train = x_train
    x_test = x_test
    # x_test = np.random.normal(x_test)
    x_train = x_train / 255
    x_test = x_test / 255

    return (x_train, y_train), (x_test, y_test)


if __name__ == '__main__':
    # load training data and testing data
    (x_train, y_train), (x_test, y_test) = load_data()

    # define network structure
    model = Sequential()

    model.add(Dense(input_dim=28 * 28, units=500, activation='relu'))
    # model.add(Dropout(0.5))
    model.add(Dense(units=500, activation='relu'))
    # model.add(Dropout(0.5))
    model.add(Dense(units=10, activation='softmax'))

    # set configurations
    model.compile(loss='categorical_crossentropy',
                  optimizer='adam', metrics=['accuracy'])

    # train model
    model.fit(x_train, y_train, batch_size=100, epochs=20)

    # evaluate the model and output the accuracy
    result_train = model.evaluate(x_train, y_train)
    result_test = model.evaluate(x_test, y_test)
    print('Train Acc:', result_train[1])
    print('Test Acc:', result_test[1])

Result


参考资料

李宏毅老师 - ML Lecture 8-1
李宏毅老师 - ML Lecture 8-2
李宏毅老师 - ML Lecture 8-3


<<:  21 - Traces - 观察应用程序的效能瓶颈 (5/6) - 透过 APM Agents 收集并传送後端服务运作的记录

>>:  【22】正规化方法 L1 与 L2 Regularizers 的比较实验

[Day 8] 整合 Koin DI 实作 Ktor Plugin

Ktor Plugin & DSL Ktor 的架构设计是让开发者透过实作 plugin,把...

Smalltalk 语言和你 SAY HELLO!!

第二十九天 各位点进来的朋友,你们好阿 小的不才只能做这个系列的文章,但还是希望分享给点进来的朋友,...

[Day 15]呐呐,还有一半别想跑(前端篇)

挑战目标: MockNative Camp 今天继续来制作我们的Footer, 目标 前两天我们已经...

Day 03-选择Node.js&Express

Node.js: 是一种用JavaScript撰写的环境,以及内建处理网路请求和函式库。 为什麽选择...

【Day28】企业数位治理议题1:系统因应企业商业模式变动弹性调整

#odoo #开源系统 #数位赋能 #E化自主 前言 在我们对於odoo社区版重要应用模组功能有简单...