四、使用TensorFlow2.0将手写数字集(MNIST)分为训练集,验证集和测试集(6:2:2),进行Tensorflow2的数据加载、多神经网络模型的搭建、分类模型的交叉验证、模型保存和新数据预测(自己手写一个数字到保存的模型中验证)。
时间: 2023-06-13 21:07:20 浏览: 105
好的,我来为您介绍一下如何使用TensorFlow2.0对MNIST数据集进行训练、验证和测试,并进行模型的保存和新数据的预测。
首先,我们需要导入相关的库和数据集。TensorFlow2.0中已经集成了MNIST数据集,我们可以直接使用:
```python
import tensorflow as tf
# 加载MNIST数据集
mnist = tf.keras.datasets.mnist
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
```
接下来,我们需要对数据进行预处理,包括归一化和将标签转换为独热编码。代码如下:
```python
# 归一化
train_images, test_images = train_images / 255.0, test_images / 255.0
# 将标签转换为独热编码
train_labels = tf.keras.utils.to_categorical(train_labels, num_classes=10)
test_labels = tf.keras.utils.to_categorical(test_labels, num_classes=10)
```
然后,我们将数据集分为训练集、验证集和测试集。代码如下:
```python
# 将训练集分为训练集和验证集
train_images, val_images = train_images[:50000], train_images[50000:]
train_labels, val_labels = train_labels[:50000], train_labels[50000:]
# 打印数据集的大小
print('Train dataset size:', train_images.shape[0])
print('Validation dataset size:', val_images.shape[0])
print('Test dataset size:', test_images.shape[0])
```
接着,我们可以搭建多层神经网络模型。这里我们使用一个包含两个隐藏层的全连接神经网络。代码如下:
```python
# 定义模型
model = tf.keras.models.Sequential([
tf.keras.layers.Flatten(input_shape=(28, 28)),
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dense(64, activation='relu'),
tf.keras.layers.Dense(10, activation='softmax')
])
# 编译模型
model.compile(optimizer='adam',
loss='categorical_crossentropy',
metrics=['accuracy'])
```
模型搭建好之后,我们可以进行交叉验证。这里我们使用K折交叉验证,将训练集分为5份,每次使用其中4份作为训练集,1份作为验证集。代码如下:
```python
# K折交叉验证
k = 5
num_val_samples = len(train_images) // k
num_epochs = 10
all_scores = []
for i in range(k):
print('Processing fold #', i)
val_images = train_images[i * num_val_samples: (i + 1) * num_val_samples]
val_labels = train_labels[i * num_val_samples: (i + 1) * num_val_samples]
partial_train_images = np.concatenate(
[train_images[:i * num_val_samples],
train_images[(i + 1) * num_val_samples:]],
axis=0)
partial_train_labels = np.concatenate(
[train_labels[:i * num_val_samples],
train_labels[(i + 1) * num_val_samples:]],
axis=0)
model = tf.keras.models.Sequential([
tf.keras.layers.Flatten(input_shape=(28, 28)),
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dense(64, activation='relu'),
tf.keras.layers.Dense(10, activation='softmax')
])
model.compile(optimizer='adam',
loss='categorical_crossentropy',
metrics=['accuracy'])
model.fit(partial_train_images, partial_train_labels,
epochs=num_epochs, batch_size=512, verbose=0)
val_loss, val_acc = model.evaluate(val_images, val_labels, verbose=0)
all_scores.append(val_acc)
print('All validation scores:', all_scores)
print('Mean validation score:', np.mean(all_scores))
```
交叉验证完成之后,我们可以使用测试集对模型进行测试。代码如下:
```python
# 使用测试集进行测试
test_loss, test_acc = model.evaluate(test_images, test_labels, verbose=0)
print('Test accuracy:', test_acc)
```
最后,我们可以将模型保存下来,并使用自己手写的数字进行预测。代码如下:
```python
# 保存模型
model.save('mnist_model.h5')
# 加载模型
model = tf.keras.models.load_model('mnist_model.h5')
# 预测新数据
import cv2
import numpy as np
# 读取手写数字图片
img = cv2.imread('test.jpg', cv2.IMREAD_GRAYSCALE)
img = cv2.resize(img, (28, 28))
# 归一化
img = img / 255.0
# 转换为模型所需的输入格式
img = img.reshape((1, 28, 28))
# 预测
result = model.predict(img)
# 显示预测结果
print('Predicted digit:', np.argmax(result))
```
以上就是使用TensorFlow2.0对MNIST数据集进行训练、验证和测试,并进行模型保存和新数据的预测的完整代码。
阅读全文