Liu/ANN_mnist.py

110 lines
4.6 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#===============================================
# 训练简单的神经网络,并显示运行时间
# 数据集mnnist
#===============================================
"""from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
import datetime
starttime = datetime.datetime.now()
import tensorflow as tf
import numpy as np
# Import data
from tensorflow.examples.tutorials.mnist import input_data
flags = tf.app.flags
FLAGS = flags.FLAGS
flags.DEFINE_string('data_dir', '/learn/tensorflow/python/data/', 'Directory for storing data') # 把数据放在/data文件夹中
mnist_data = input_data.read_data_sets(FLAGS.data_dir, one_hot=True) # 读取数据集
# 建立抽象模型
x = tf.placeholder(tf.float32, [None, 784]) # 占位符
y = tf.placeholder(tf.float32, [None, 10])
W = tf.Variable(tf.zeros([784, 10]))
b = tf.Variable(tf.zeros([10]))
a = tf.nn.softmax(tf.matmul(x, W) + b)
# 定义损失函数和训练方法
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y * tf.log(a), reduction_indices=[1])) # 损失函数为交叉熵学习速率要设为0.3量级
#cross_entropy = -tf.reduce_sum(y * tf.log(a)) # 损失函数为交叉熵
optimizer = tf.train.GradientDescentOptimizer(0.3) # 梯度下降法学习速率要设为0.001量级
train_next = optimizer.minimize(cross_entropy) # 训练目标:最小化损失函数
# Train
sess = tf.InteractiveSession() # 建立交互式会话
# tf.global_variables_initializer().run()
sess.run(tf.global_variables_initializer())
for i in range(1000):
batch_xs, batch_ys = mnist_data.train.next_batch(100) # 随机抓取100个数据
# train_next.run({x: batch_xs, y: batch_ys})
sess.run(train_next, feed_dict={x: batch_xs, y: batch_ys})
#测试
correct_prediction = tf.equal(tf.argmax(a, 1), tf.argmax(y, 1))
# tf.cast先将数据转换成float防止求平均不准确:比如 tf.float32就是正确写成tf.float16导致不准确超出范围。
accuracy = tf.reduce_mean(tf.cast(correct_prediction, 'float'))
print(sess.run(accuracy,feed_dict={x:mnist_data.test.images,y:mnist_data.test.labels}))
endtime=datetime.datetime.now()
print('total time endtime-starttime:', endtime-starttime)"""
"""由于tensorflow更新至了2.0,1.0的方法许多已经被合并调整后弃用了,所以使用chatgpt更新了2.0版本的代码如下"""
# 导入 TensorFlow 和相关的 Keras 类和函数
import tensorflow as tf
from tensorflow.keras.layers import Dense
from tensorflow.keras.models import Sequential
from tensorflow.keras.optimizers import SGD
import datetime
# 加载 MNIST 数据集,这是一个手写数字的图像数据集,用于训练和测试机器学习模型。
mnist = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
# 对数据进行归一化处理,将像素值从 [0, 255] 缩放到 [0, 1] 区间,这有助于模型的训练。
x_train, x_test = x_train / 255.0, x_test / 255.0
# 将图像数据从 28x28 的矩阵形式转换成 784 维的向量形式。
x_train = x_train.reshape(-1, 784)
x_test = x_test.reshape(-1, 784)
# 将标签转换为 one-hot 编码,这是将分类标签转换为仅在对应类的位置为 1其余为 0 的向量。
y_train = tf.keras.utils.to_categorical(y_train, 10)
y_test = tf.keras.utils.to_categorical(y_test, 10)
# 创建一个 Sequential 模型。这是一种线性堆叠的模型,您可以通过在列表中添加层来构建模型。
model = Sequential([
Dense(10, activation='softmax', input_shape=(784,))
])
# 编译模型。这一步设置了模型的优化器、损失函数和评估指标。
# - 使用 SGD随机梯度下降优化器。
# - 损失函数使用 categorical_crossentropy适用于多分类问题。
# - 评估指标使用准确率accuracy
model.compile(optimizer=SGD(lr=0.3),
loss='categorical_crossentropy',
metrics=['accuracy'])
# 记录训练开始时间。
starttime = datetime.datetime.now()
# 训练模型。这里使用 fit 方法对模型进行训练。
# - x_train 和 y_train 是训练数据和标签。
# - epochs=10 表示总共训练 10 个周期。
# - batch_size=100 指定每次梯度更新时使用的样本数量。
model.fit(x_train, y_train, epochs=10, batch_size=100)
# 记录训练结束时间。
endtime = datetime.datetime.now()
# 在测试集上评估模型性能。
# - x_test 和 y_test 是测试数据和标签。
# 这里返回的是模型在测试数据上的损失值和准确率。
loss, accuracy = model.evaluate(x_test, y_test)
print(f"Test Accuracy: {accuracy}")
# 打印总的训练时间。
print('Total time (endtime - starttime):', endtime - starttime)