用TensorFlow2.0将手写数字集(MNIST)分为训练集,验证集和测试集(6:2:2),进行Tensorflow2的数据加载、多神经网络模型的搭建、分类模型的交叉验证、模型保存和新数据预测(自己手写一个数字拍照到保存的模型中验证)
时间: 2023-06-13 13:07:08 浏览: 74
基于TensorFlow使用四种算法实现mnist数据集手写数字识别仿真(源码+数据+说明文档).rar
5星 · 资源好评率100%
好的,我可以给您提供一个TensorFlow2.0实现MNIST手写数字分类的代码,包括数据加载、多神经网络模型的搭建、分类模型的交叉验证、模型保存和新数据预测(自己手写一个数字拍照到保存的模型中验证)。
首先,我们需要导入必要的库:
```
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
import numpy as np
import matplotlib.pyplot as plt
import cv2
```
然后,我们可以加载MNIST数据集并将其分为训练集、验证集和测试集。
```
(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()
# Normalize pixel values to be between 0 and 1
x_train = x_train.astype("float32") / 255
x_test = x_test.astype("float32") / 255
# Split training data into training and validation sets
x_train, x_val = x_train[:-12000], x_train[-12000:]
y_train, y_val = y_train[:-12000], y_train[-12000:]
# Print shapes of training, validation, and test sets
print("x_train shape:", x_train.shape)
print("y_train shape:", y_train.shape)
print("x_val shape:", x_val.shape)
print("y_val shape:", y_val.shape)
print("x_test shape:", x_test.shape)
print("y_test shape:", y_test.shape)
```
接下来,我们可以搭建多神经网络模型并进行交叉验证。这里我们使用了一个包含两个隐藏层的全连接神经网络。
```
model = keras.Sequential([
layers.Flatten(input_shape=(28, 28)),
layers.Dense(256, activation='relu'),
layers.Dropout(0.3),
layers.Dense(128, activation='relu'),
layers.Dropout(0.2),
layers.Dense(10, activation='softmax')
])
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
# Cross-validation
history = model.fit(x_train, y_train, epochs=10, batch_size=64, validation_data=(x_val, y_val))
```
我们可以使用matplotlib来绘制训练和验证的准确率和损失值。
```
# Plot training and validation accuracy values
plt.plot(history.history['accuracy'])
plt.plot(history.history['val_accuracy'])
plt.title('Model accuracy')
plt.ylabel('Accuracy')
plt.xlabel('Epoch')
plt.legend(['Train', 'Val'], loc='upper left')
plt.show()
# Plot training and validation loss values
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.title('Model loss')
plt.ylabel('Loss')
plt.xlabel('Epoch')
plt.legend(['Train', 'Val'], loc='upper left')
plt.show()
```
当我们的模型训练好之后,我们可以使用以下代码来保存模型。
```
model.save('mnist_model.h5')
```
最后,我们可以使用以下代码来预测我们自己手写的数字。
```
# Load saved model
model = keras.models.load_model('mnist_model.h5')
# Read image and resize
img = cv2.imread('test_image.png', cv2.IMREAD_GRAYSCALE)
img = cv2.resize(img, (28, 28))
# Invert colors and normalize pixel values to be between 0 and 1
img = cv2.bitwise_not(img)
img = img.astype("float32") / 255
# Reshape image to match model input shape
img = np.reshape(img, (1, 28, 28))
# Make prediction
prediction = model.predict(img)
# Print prediction
print("Prediction:", np.argmax(prediction[0]))
```
这样,我们就完成了使用TensorFlow2.0对MNIST手写数字集进行分类,并且可以使用我们训练好的模型来预测我们自己手写的数字。
阅读全文