Heim >Backend-Entwicklung >Python-Tutorial >Beispiel für die handschriftliche Ziffernerkennung in Python

Beispiel für die handschriftliche Ziffernerkennung in Python

WBOY
WBOYOriginal
2023-06-11 10:13:362242Durchsuche

Python ist eine sehr leistungsfähige Programmiersprache, die in der Datenanalyse, beim maschinellen Lernen, in der Bildverarbeitung und in anderen Bereichen weit verbreitet ist. Im Bereich des maschinellen Lernens ist die handschriftliche Ziffernerkennung ein sehr wichtiges Thema und kann auf viele Bereiche wie die Erkennung von Verifizierungscodes, autonomes Fahren und Spracherkennung angewendet werden. In diesem Artikel stellen wir vor, wie man die handschriftliche Ziffernerkennung mit Python implementiert.

  1. Einführung in Datensätze

Beim maschinellen Lernen ist die Auswahl von Datensätzen sehr wichtig. Für das Problem der handschriftlichen Ziffernerkennung benötigen wir einen beschrifteten Datensatz. Der am häufigsten verwendete Datensatz ist der MNIST-Datensatz (Modified National Institute of Standards and Technology), der insgesamt 60.000 Trainingsbilder und 10.000 Testbilder enthält. Jedes Bild ist ein 28 x 28 Pixel großes Graustufenbild.

  1. Laden des Datensatzes

Um den MNIST-Datensatz zu verwenden, können wir ihn über die Python-Bibliothek laden. In diesem Beispiel verwenden wir die Keras-Bibliothek von Tensorflow, um den MNIST-Datensatz zu laden.

from keras.datasets import mnist

# 加载MNIST数据集
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()

Hier speichern wir Trainingsbilder und Beschriftungen in train_images und train_labels und Testbilder und Beschriftungen in test_images und test_labels. train_imagestrain_labels 中,将测试图像和标签存储在 test_imagestest_labels 中。

  1. 数据预处理

在机器学习中,我们通常需要对数据进行预处理,以提高模型的表现。对于MNIST数据集,我们需要将像素值转换为0到1之间的浮点数,并将28x28的图像转换为784维向量,以便我们可以将其输入到模型中。

# 数据预处理
train_images = train_images.reshape((60000, 28 * 28))
train_images = train_images.astype('float32') / 255

test_images = test_images.reshape((10000, 28 * 28))
test_images = test_images.astype('float32') / 255
  1. 构建模型

在Keras中构建神经网络非常简单,我们只需要定义一个Sequential对象,然后添加层即可。对于这个手写数字识别问题,我们使用一个包含两个密集层的简单神经网络。

from keras import models
from keras import layers

network = models.Sequential()
network.add(layers.Dense(512, activation='relu', input_shape=(28 * 28,)))
network.add(layers.Dense(10, activation='softmax'))

这里我们使用 Dense 层,每个神经元都与前一层的所有神经元相连,并使用ReLU激活函数来增加非线性。

  1. 编译模型

在训练模型之前,我们需要通过编译来配置学习过程。在这里,我们使用交叉熵损失函数和RMSprop优化器。同时,我们还将添加准确率作为衡量指标。

network.compile(optimizer='rmsprop',
                loss='categorical_crossentropy',
                metrics=['accuracy'])
  1. 训练模型

现在我们可以使用我们加载的数据集来训练模型了。在这里,我们将训练模型5次(epochs=5)。

network.fit(train_images, train_labels, epochs=5, batch_size=128)
  1. 测试模型

使用训练好的模型对测试数据进行预测并计算准确率。

test_loss, test_acc = network.evaluate(test_images, test_labels)
  1. 实际应用

现在我们已经训练好了一个手写数字识别模型,可以在实际应用中使用了。以下是一个例子,演示了如何使用模型来识别手写数字。

import numpy as np
from keras.preprocessing import image

# 加载手写数字图像
img = image.load_img(path_to_img, grayscale=True, target_size=(28, 28))
x = image.img_to_array(img)
x = np.expand_dims(x, axis=0)

# 预测手写数字
prediction = network.predict(x)

# 输出结果
print(prediction)

这里我们首先使用image.load_img函数加载一个手写数字图像,然后将其转换为模型所需的格式。最后使用network.predict

    Datenvorverarbeitung
    1. Beim maschinellen Lernen müssen wir normalerweise Daten vorverarbeiten, um die Leistung des Modells zu verbessern. Für den MNIST-Datensatz müssen wir die Pixelwerte in Gleitkommazahlen zwischen 0 und 1 umwandeln und das 28x28-Bild in einen 784-dimensionalen Vektor umwandeln, damit wir es in das Modell eingeben können.
    rrreee

      Aufbau des Modells

      🎜🎜Der Aufbau eines neuronalen Netzwerks in Keras ist sehr einfach, wir müssen nur ein Sequential-Objekt definieren und dann Ebenen hinzufügen. Für dieses handschriftliche Ziffernerkennungsproblem verwenden wir ein einfaches neuronales Netzwerk mit zwei dichten Schichten. 🎜rrreee🎜Hier verwenden wir eine Dense-Schicht, in der jedes Neuron mit allen Neuronen in der vorherigen Schicht verbunden ist, und verwenden eine ReLU-Aktivierungsfunktion, um Nichtlinearität hinzuzufügen. 🎜
        🎜Kompilieren Sie das Modell🎜🎜🎜Bevor wir das Modell trainieren, müssen wir den Lernprozess durch Kompilierung konfigurieren. Hier verwenden wir die Cross-Entropy-Loss-Funktion und den RMSprop-Optimierer. Gleichzeitig werden wir auch die Genauigkeit als Messgröße hinzufügen. 🎜rrreee
          🎜Training des Modells🎜🎜🎜Jetzt können wir das Modell mit dem von uns geladenen Datensatz trainieren. Hier trainieren wir das Modell fünfmal (Epochen = 5). 🎜rrreee
            🎜Testen Sie das Modell🎜🎜🎜Verwenden Sie das trainierte Modell, um die Testdaten vorherzusagen und die Genauigkeit zu berechnen. 🎜rrreee
              🎜Praktische Anwendung🎜🎜🎜Jetzt haben wir ein handschriftliches Ziffernerkennungsmodell trainiert und können es in praktischen Anwendungen einsetzen. Unten sehen Sie ein Beispiel, das zeigt, wie ein Modell zum Erkennen handgeschriebener Ziffern verwendet wird. 🎜rrreee🎜Hier verwenden wir zunächst die Funktion image.load_img, um ein Bild handgeschriebener Ziffern zu laden und es dann in das vom Modell benötigte Format zu konvertieren. Verwenden Sie abschließend die Funktion network.predict, um die Ergebnisse vorherzusagen und auszugeben. 🎜🎜🎜Zusammenfassung🎜🎜🎜In diesem Artikel haben wir vorgestellt, wie man die handschriftliche Ziffernerkennung mithilfe der Python- und Keras-Bibliothek implementiert. In diesem Prozess lernten wir das Laden des MNIST-Datensatzes, die Datenvorverarbeitung, den Aufbau eines neuronalen Netzwerkmodells, das Kompilieren des Modells, das Training des Modells, das Testen des Modells und praktische Anwendungen. Ich hoffe, dieses Beispiel kann Anfängern helfen, maschinelles Lernen besser zu verstehen. 🎜

Das obige ist der detaillierte Inhalt vonBeispiel für die handschriftliche Ziffernerkennung in Python. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn