📜  Python|使用 Keras 进行图像分类(1)

📅  最后修改于: 2023-12-03 15:19:17.892000             🧑  作者: Mango

Python | 使用 Keras 进行图像分类

Keras 是一个高层神经网络 API,能够以 TensorFlow、CNTK 或 Theano 作为后端运行。它允许用户快速搭建神经网络,并进行训练和测试。

因此,使用 Keras 进行图像分类,是非常方便和快捷的。

步骤

使用 Keras 进行图像分类需要如下步骤:

  1. 导入必要的库和模块:kerasnumpymatplotlib
  2. 加载数据集:可以使用 mnistcifar10 作为样本数据集。
  3. 对数据进行预处理:将数据归一化、进行 one-hot 编码。
  4. 设计模型结构:构建一个包含卷积层、池化层、全连接层的神经网络。
  5. 编译模型:选择损失函数、优化器,并定义评估指标。
  6. 训练模型:使用 fit 函数进行模型拟合,得到模型参数。
  7. 评估模型:使用测试集进行模型评估,得到模型准确率。
  8. 使用模型进行预测:使用 predict 函数,对新的数据进行预测。
代码

下面是一个使用 Keras 进行图像分类的示例程序。

# 导入必要的库和模块
import keras
import numpy as np
import matplotlib.pyplot as plt

# 加载数据集
from keras.datasets import cifar10
(x_train, y_train), (x_test, y_test) = cifar10.load_data()

# 对数据进行预处理
x_train = x_train / 255.0
x_test = x_test / 255.0
y_train = keras.utils.to_categorical(y_train, 10)
y_test = keras.utils.to_categorical(y_test, 10)

# 设计模型结构
model = keras.models.Sequential()
model.add(keras.layers.Conv2D(32, (3, 3), activation='relu', input_shape=(32, 32, 3)))
model.add(keras.layers.MaxPooling2D((2, 2)))
model.add(keras.layers.Conv2D(64, (3, 3), activation='relu'))
model.add(keras.layers.MaxPooling2D((2, 2)))
model.add(keras.layers.Conv2D(64, (3, 3), activation='relu'))
model.add(keras.layers.Flatten())
model.add(keras.layers.Dense(64, activation='relu'))
model.add(keras.layers.Dense(10, activation='softmax'))

# 编译模型
model.compile(loss='categorical_crossentropy',
              optimizer='adam',
              metrics=['accuracy'])

# 训练模型
history = model.fit(x_train, y_train,
                    epochs=10,
                    batch_size=64,
                    validation_data=(x_test, y_test))

# 评估模型
test_loss, test_acc = model.evaluate(x_test, y_test)
print('Test accuracy:', test_acc)

# 使用模型进行预测
predictions = model.predict(x_test[:1])
print(predictions)
结果

运行上面的代码,可以得到如下的训练过程和准确率。

Epoch 1/10
782/782 [==============================] - 75s 95ms/step - loss: 1.6789 - accuracy: 0.3885 - val_loss: 1.3111 - val_accuracy: 0.5283
Epoch 2/10
782/782 [==============================] - 88s 112ms/step - loss: 1.2391 - accuracy: 0.5562 - val_loss: 1.1506 - val_accuracy: 0.5967
Epoch 3/10
782/782 [==============================] - 67s 86ms/step - loss: 1.0774 - accuracy: 0.6198 - val_loss: 1.1027 - val_accuracy: 0.6193
Epoch 4/10
782/782 [==============================] - 70s 89ms/step - loss: 0.9598 - accuracy: 0.6624 - val_loss: 0.9748 - val_accuracy: 0.6617
Epoch 5/10
782/782 [==============================] - 76s 97ms/step - loss: 0.8716 - accuracy: 0.6928 - val_loss: 0.9577 - val_accuracy: 0.6682
Epoch 6/10
782/782 [==============================] - 73s 93ms/step - loss: 0.8026 - accuracy: 0.7186 - val_loss: 0.9305 - val_accuracy: 0.6773
Epoch 7/10
782/782 [==============================] - 76s 97ms/step - loss: 0.7472 - accuracy: 0.7349 - val_loss: 0.9163 - val_accuracy: 0.6823
Epoch 8/10
782/782 [==============================] - 69s 88ms/step - loss: 0.6762 - accuracy: 0.7612 - val_loss: 0.9047 - val_accuracy: 0.6906
Epoch 9/10
782/782 [==============================] - 73s 93ms/step - loss: 0.6245 - accuracy: 0.7795 - val_loss: 0.9124 - val_accuracy: 0.6933
Epoch 10/10
782/782 [==============================] - 61s 78ms/step - loss: 0.5731 - accuracy: 0.7976 - val_loss: 0.9050 - val_accuracy: 0.7039
313/313 [==============================] - 4s 14ms/step - loss: 0.9050 - accuracy: 0.7039
Test accuracy: 0.7039000391960144
[[3.2624233e-04 5.2681177e-04 3.0000822e-04 5.1687245e-02 1.2076471e-03
  9.3258605e-03 6.0175366e-06 9.3458267e-01 1.6721189e-05 3.9974212e-03]]

同时,执行 plt.plot(history.history['accuracy'], label='accuracy')plt.plot(history.history['val_accuracy'], label = 'val_accuracy') 可以给出训练/测试准确率曲线。

结论

本例提供了一种使用 Keras 进行图像分类的方法,通过对模型结构、编译模型、训练模型、评估模型进行设置,能够得到一定的分类准确率,这对训练线上模型具有实用性。