``` !mkdir -p ~/.keras/datasets !cp work/mnist.npz ~/.keras/datasets/ import warnings warnings.filterwarnings("ignore") from keras.datasets import mnist #train_images 和 train_labels 组成了训练集(training set),模型将从这些数据中进行学习。 #然后在测试集(test set,即 test_images 和 test_labels)上对模型进行测试。 (train_images, train_labels), (test_images, test_labels) = mnist.load_data() train_images.shape#看下数据的维度 len(train_labels) train_labels test_images.shape len(test_labels) test_labels from keras import models from keras import layers # 构建神经网络模型 network = models.Sequential() network.add(layers.Dense(512, activation='relu', input_shape=(28 * 28,))) network.add(layers.Dense(10, activation='softmax')) network.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy']) train_images = train_images.reshape((60000, 28 * 28)) train_images = train_images.astype('float32') / 255 test_images = test_images.reshape((10000, 28 * 28)) test_images = test_images.astype('float32') / 255 from keras.utils import to_categorical train_labels = to_categorical(train_labels) test_labels = to_categorical(test_labels) network.fit(train_images, train_labels, epochs=5, batch_size=128) test_loss, test_acc = network.evaluate(test_images, test_labels) print('test_acc:', test_acc)```cp: cannot stat 'work/mnist.npz': No such file or directory;Using TensorFlow backend.;WARNING: Logging before flag parsing goes to stderr. W0407 05:07:41.395064 139824211502912 module_wrapper.py:139] From /opt/conda/lib/python3.6/site-packages/keras/backend/tensorflow_backend.py:74: The name tf.get_default_graph is deprecated. Please use tf.compat.v1.get_default_graph instead. W0407 05:07:41.399161 139824211502912 module_wrapper.py:139] From /opt/conda/lib/python3.6/site-packages/keras/backend/tensorflow_backend.py:517: The name tf.placeholder is deprecated. Please use tf.compat.v1.placeholder instead. W0407 05:07:41.404188 139824211502912 module_wrapper.py:139] From /opt/conda/lib/python3.6/site-packages/keras/backend/tensorflow_backend.py:4138: The name tf.random_uniform is deprecated. Please use tf.random.uniform instead.
时间: 2025-04-08 12:01:05 浏览: 28
从您的代码来看,您试图通过 Keras 框架加载 MNIST 数据集并构建一个多层感知机(MLP)模型来进行手写数字分类任务。然而,在运行过程中遇到了一些问题,例如:
### 主要错误分析:
1. **`cp: cannot stat 'work/mnist.npz': No such file or directory`**
这是因为命令 `!cp work/mnist.npz ~/.keras/datasets/` 中指定的文件路径不存在。这可能是由于缺少本地的数据文件 `mnist.npz` 或者路径拼写有误。
2. **警告信息**
警告提示了 TensorFlow 的 API 已经弃用了某些函数(如 `tf.placeholder`, `tf.get_default_graph` 等)。这是因为在较新的 TensorFlow 版本中引入了一些替代功能,因此建议使用兼容模式下的新方法。
---
### 具体解决步骤:
#### 一、检查数据是否可用
如果您希望直接下载 MNIST 数据而无需手动复制文件,则可以直接注释掉这两行或删除它们:
```python
#!mkdir -p ~/.keras/datasets
#!cp work/mnist.npz ~/.keras/datasets/
```
因为当调用 `(train_images, train_labels), (test_images, test_labels) = mnist.load_data()` 时,Keras 自动会尝试在线获取该数据集,并将其存储到默认目录下 (`~/.keras/datasets`)。
#### 二、修正警告消息
对于 TensorFlow 的警告信息,您可以选择忽略它或者升级框架版本至最新稳定版。如果不想看到冗余的日志输出可以设置环境变量关闭日志打印级别:
```python
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3' # 设置为最高级抑制所有log内容
```
#### 三、完整工作示例调整后的代码如下所示:
以下是经过修改优化过的版本供参考:
```python
# 导入必要的库包
import numpy as np
import matplotlib.pyplot as plt
from tensorflow.keras.datasets import mnist
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout
from tensorflow.keras.utils import to_categorical
# 加载MNIST手写字母图片数据库
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
# 查看训练样本大小及标签类别分布情况
print(f"Training data shape : {train_images.shape}, labels length={len(train_labels)}")
# 归一化处理像素值范围[0,255]-> [0,1]
x_train = train_images.reshape((60000, 28*28)).astype('float32') / 255
x_test = test_images.reshape((10000, 28*28)).astype('float32') / 255
y_train = to_categorical(train_labels)
y_test = to_categorical(test_labels)
# 定义全连接Dense类型的神经网络结构
model = Sequential([
Dense(512, activation="relu", input_shape=(28 * 28,)),
Dropout(rate=0.2),
Dense(10, activation='softmax')
])
model.compile(loss="categorical_crossentropy",
optimizer="adam",
metrics=["accuracy"])
history = model.fit(x=x_train,
y=y_train,
validation_split=.2,
epochs=5,
batch_size=128)
score = model.evaluate(x_test, y_test, verbose=False)
print("Test accuracy:", score[1])
```
#### 四、改进点解释说明:
1. 替换了旧式 `keras` 包引用为更现代统一的模块名称空间——`tensorflow.keras`.
2. 增加了一个正则化手段Dropout防止过拟合现象发生。
3. 使用Adam作为梯度下降算法相比RMSProp收敛速度更快且效果更好。
4. 提高验证比例方便观察loss变化趋势曲线图绘制等后续可视化操作需求。
---
###
阅读全文
相关推荐













