利用CNN实现MNIST手写数字图像分类,要求打印模型架构信息,显示模型准确率和损失值,显示训练集和验证集的acc和loss曲线
时间: 2024-09-25 14:13:35 浏览: 40
利用卷积神经网络(Convolutional Neural Network, CNN)对MNIST手写数字数据集进行分类,通常包括以下几个步骤:
1. **导入库和数据**:首先需要导入必要的深度学习库如TensorFlow或PyTorch,以及加载MNIST数据集。
```python
import tensorflow as tf
from tensorflow.keras.datasets import mnist
```
2. **预处理数据**:将像素值归一化到0-1范围,并拆分数据集为训练集和测试集。
```python
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0
```
3. **构建CNN模型**:创建一个简单的CNN模型结构,包括卷积层、池化层和全连接层。
```python
model = tf.keras.models.Sequential([
tf.keras.layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)),
tf.keras.layers.MaxPooling2D((2, 2)),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(64, activation='relu'),
tf.keras.layers.Dropout(0.5),
tf.keras.layers.Dense(10, activation='softmax')
])
```
4. **模型摘要**:打印模型架构信息。
```python
model.summary()
```
5. **编译模型**:设置优化器、损失函数和评价指标,比如交叉熵损失和准确率。
```python
model.compile(optimizer='adam',
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
metrics=['accuracy'])
```
6. **训练模型**:使用训练数据集训练模型,同时记录训练集和验证集的acc和loss。
```python
history = model.fit(x_train.reshape(-1, 28, 28, 1), y_train,
validation_split=0.2,
epochs=10,
verbose=2)
```
7. **评估模型**:在测试集上评估模型性能并打印准确率。
```python
test_loss, test_acc = model.evaluate(x_test.reshape(-1, 28, 28, 1), y_test, verbose=2)
print(f"Test accuracy: {test_acc}")
```
8. **绘制训练过程曲线**:可以使用`plot_history`函数从`history.history`中获取acc和loss数据,然后绘制图表。
```python
import matplotlib.pyplot as plt
plt.plot(history.history['accuracy'], label='Training Accuracy')
plt.plot(history.history['val_accuracy'], label='Validation Accuracy')
plt.xlabel('Epochs')
plt.ylabel('Accuracy')
plt.legend()
plt.show()
# 同理绘制Loss曲线
plt.plot(history.history['loss'], label='Training Loss')
plt.plot(history.history['val_loss'], label='Validation Loss')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend()
plt.show()
```
阅读全文