深度神经网络实现手写体数字识别:Python代码开发与数据可视化
以下是一个使用Python和深度学习库Keras实现手写数字识别的简单示例。首先,我们需要安装所需的库:
```bash
pip install tensorflow keras numpy matplotlib
```
接下来,我们将实现数据加载、数据预处理、神经网络架构、训练过程设置超参数、启动神经网络训练以及可视化损失函数值和测试集数据上的测试值。
```python
import numpy as np
import matplotlib.pyplot as plt
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten
from keras.layers import Conv2D, MaxPooling2D
from keras import backend as K
from keras.optimizers import Adam
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import image
import os
# 加载数据并进行预处理
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train = x_train.reshape(x_train.shape[0], 28, 28, 1).astype('float32') / 255
x_test = x_test.reshape(x_test.shape[0], 28, 28, 1).astype('float32') / 255
y_train = np.eye(10)[y_train]
y_test = np.eye(10)[y_test]
# 将标签转换为one-hot编码
num_classes = y_test.shape[1]
y_train = keras.utils.to_categorical(y_train, num_classes)
y_test = keras.utils.to_categorical(y_test, num_classes)
# 定义神经网络架构
def create_model():
model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=(28, 28, 1)))
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'))
sgd = Adam(lr=0.001, decay=1e-6)
model.compile(loss='categorical_crossentropy', metrics=['accuracy'], optimizer=sgd)
return model
# 创建模型并设置超参数
model = create_model()
K.set_value(backend.learning_phase(), 1)
batch_size = 32
epochs = 50
num_classes = len(np.unique(y_test))
print('Number of classes: ', num_classes)
data_shape = (x_train.shape[1], x_train.shape[2], x_train.shape[3])
print('Data shape: ', data_shape)
# 将图像数据扩展一维以适应批量大小
x_train = x_train.reshape(batch_size, *data_shape)
x_test = x_test.reshape(batch_size, *data_shape)
y_train = y_train.reshape(batch_size, num_classes)
y_test = y_test.reshape(batch_size, num_classes)
# 将图像数据归一化到0-1之间
x_train = x_train.astype('float32') / 255
x_test = x_test.astype('float32') / 255
y_train = y_train.astype('float32') / 255
y_test = y_test.astype('float32') / 255
# 将标签转换为one-hot编码并计算损失函数值和准确率
history = model.fit(x_train, y_train, batch_size=batch_size, epochs=epochs, verbose=1, validation_data=(x_test, y_test))
score = history.history['val_loss'] # 在验证集上获得的损失函数值列表中的第一个元素是验证集上的平均损失函数值。如果要获得其他指标如准确率等,请查看history对象的其他属性。例如:history.history['acc']表示在验证集上获得的准确率。history.history['loss']表示在训练集上获得的损失函数值。请注意,这些指标仅适用于验证集。对于训练集或测试集的指标,请查看相应的属性。例如:history.history['loss']表示在训练集上获得的损失函数值。history.history['val_loss']表示在验证集上获得的损失函数值。history.epoch可以用于获取每个epoch的损失函数值和准确率。通过索引即可访问它们。例如:history.epoch[-1]表示最后一个epoch的损失函数值和准确率。
创作工场
免责声明:
以上内容除特别注明外均来源于网友提问,创作工场回答,未经许可,严谨转载。
点击这里>>使用🔥专业版,更聪明、更完整、更原创!