此处使用的mnist数据集由TensorFlow包提供,仅需要导入TensorFlow即可。使用的是keras接口,仅仅20行代码就能完成整个任务,此处着重于了解
- 数据集在python运行时的中的形式(数据结构)
- 使用TensorFlow搭建神经网络的各个参数的意义
代码:
-
import tensorflow as tf
-
mnits=tf.keras.datasets.mnist
-
(train_x,train_y),(test_x,test_y)=mnits.load_data()
-
train_x=train_x/255.0 test_x=test_x/255.0
-
model=tf.keras.models.Sequential([
-
tf.keras.layers.Flatten(),
-
tf.keras.layers.Dense(128,activation='relu'),
-
tf.keras.layers.Dense(10,activation="softmax")
-
])
-
model.compile(optimizer='adam',
-
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False),
-
metrics=['sparse_categorical_accuracy']
-
)
-
model.fit(train_x,train_y,batch_size=32,epochs=5,validation_data=(test_x,test_y),validation_freq=1)
-
model.summary()
首先在第6行处设置断点观察样例数据的结构。样本数据中Y是标签,是简单的一个一维数组,每个元素是标签的标号。X是样本,test中有一万个样例,每个样例是一个28行28列的图像像素值组成的二维数组,所以test_x是一个一万个对象的数组,其中的每个对象是一幅图像的二维数组。
第九行Flattern()将每张图片的二维数组表示方式转换为一维数组的表示方式,变成一个784个元素的一维数组。
第十行表示第一层神经网络使用128个神经元(为什么是128?)使用relu函数(斜坡函数)作为激活函数。
第十一行表示第二层神经网络使用10个神经元,因为手写数字识别的结果是0-9十个数字,十个分类。使用softmax函数将结果转换为符合概率分布的值。
优化器使用的是adam;from_logits=False意味着神经网络的预测结果不是原始值,而是经过变换得到的孵化概率分布的值,此处是使用softmax函数转换过的所以不是logits(logits指未经转换的不符合概率分布的值)。如果最后一层神经网络的输出结果没有做符合概率分布的处理,那么使用from_logits=True。