深度学习框架tensorflow二实战(分类问题:MNIST)

之前有过介绍Tensorflow1版本的MNIST分类,现在简单介绍一下Tensorflow2的分类实现。

首先,先下载MNIST数据集。

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import datasets #导入经典数据集加载模块
"""
Boston Housing波士顿房价趋势数据集,用于回归模型训练与测试
CIFAR10/100 真实图片数据集,用于图片分类任务
MNIST/Fashion_MNIST 手写数字图片数据集,用于图片分类任务
IMDB 情感分类任务数据集
"""
(x,y),(x_test,y_test)=datasets.mnist.load_data()
print(x.shape)
print(y.shape)
print(x_test.shape)
print(y_test.shape)

Tensorflow会默认将数据缓存在用户目录下的.keras/datasets文件夹,因此如果有了会跳过这一下载的步骤。可以看到有6w张的训练集以及1w张的测试集。

Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/mnist.npz
11493376/11490434 [==============================] - 226s 20us/step
(60000, 28, 28)
(60000,)
(10000, 28, 28)
(10000,)

展示数据:

import matplotlib.pyplot as plt
plt.imshow(x[0],cmap="gray")
plt.show()

在这里插入图片描述

模型构造:

x=x.reshape(x.shape[0],28*28)
x_test=x_test.reshape(x_test.shape[0],28*28)
import tensorflow as tf
from tensorflow.keras import layers

model = tf.keras.Sequential()
model.add(layers.Dense(32, activation='relu'))
model.add(layers.Dense(32, activation='relu'))
model.add(layers.Dense(10, activation='softmax'))

#一定选择合适的损失函数,这里选择交叉熵函数
#Adam 算法和传统的随机梯度下降不同。
#SGD随机梯度下降保持单一的学习率(即 alpha)更新所有的权重,学习率在训练过程中并不会改变。
#Adam则会采用自适应性学习率
#使用tf.losses.SparseCategoricalCrossentropy()就不需要对标签one-hot编码
#metrics即度量标准:训练完对模型对数据的分类结果
model.compile(optimizer=tf.keras.optimizers.Adam(0.001),
             loss=tf.losses.SparseCategoricalCrossentropy(),
             metrics=[tf.keras.metrics.SparseCategoricalAccuracy()])

model.fit(x, y, epochs=5, batch_size=64,
          validation_data=(x_test, y_test))

成功率一下子就到了九成hh

Train on 60000 samples, validate on 10000 samples
Epoch 1/5
60000/60000 [==============================] - 2s 29us/sample - loss: 1.9981 - sparse_categorical_accuracy: 0.7011 - val_loss: 0.6197 - val_sparse_categorical_accuracy: 0.8382
Epoch 2/5
60000/60000 [==============================] - 1s 20us/sample - loss: 0.5052 - sparse_categorical_accuracy: 0.8724 - val_loss: 0.4220 - val_sparse_categorical_accuracy: 0.8974
Epoch 3/5
60000/60000 [==============================] - 1s 20us/sample - loss: 0.3657 - sparse_categorical_accuracy: 0.9072 - val_loss: 0.3493 - val_sparse_categorical_accuracy: 0.9125
Epoch 4/5
60000/60000 [==============================] - 1s 20us/sample - loss: 0.3109 - sparse_categorical_accuracy: 0.9197 - val_loss: 0.3175 - val_sparse_categorical_accuracy: 0.9222
Epoch 5/5
60000/60000 [==============================] - 1s 20us/sample - loss: 0.2824 - sparse_categorical_accuracy: 0.9260 - val_loss: 0.2915 - val_sparse_categorical_accuracy: 0.9271

使用tf.data进行操作(替代模型构造的一部分)

train = tf.data.Dataset.from_tensor_slices((x, y))
train = train.batch(32)
train = train.repeat()

valid = tf.data.Dataset.from_tensor_slices((x_test, y_test))
valid = valid.batch(32)
valid = valid.repeat()

model.compile(optimizer=tf.keras.optimizers.Adam(0.001),
             loss=tf.losses.SparseCategoricalCrossentropy(),
             metrics=[tf.keras.metrics.SparseCategoricalAccuracy()])
             
model.fit(train, epochs=5,steps_per_epoch=100, validation_data=valid,validation_steps=100)

完整代码:

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import datasets #导入经典数据集加载模块
"""
Boston Housing波士顿房价趋势数据集,用于回归模型训练与测试
CIFAR10/100 真实图片数据集,用于图片分类任务
MNIST/Fashion_MNIST 手写数字图片数据集,用于图片分类任务
IMDB 情感分类任务数据集
"""

(x,y),(x_test,y_test)=datasets.mnist.load_data()
print(x.shape)
print(y.shape)
print(x_test.shape)
print(y_test.shape)

print(x[0].shape)
import matplotlib.pyplot as plt
plt.imshow(x[0],cmap="gray")
plt.show()


x=x.reshape(x.shape[0],28*28)
x_test=x_test.reshape(x_test.shape[0],28*28)
import tensorflow as tf
from tensorflow.keras import layers

model = tf.keras.Sequential()
model.add(layers.Dense(32, activation='relu'))
model.add(layers.Dense(32, activation='relu'))
model.add(layers.Dense(10, activation='softmax'))

#一定选择合适的损失函数,这里选择交叉熵函数
#Adam 算法和传统的随机梯度下降不同。
#SGD随机梯度下降保持单一的学习率(即 alpha)更新所有的权重,学习率在训练过程中并不会改变。
#Adam则会采用自适应性学习率
#使用tf.losses.SparseCategoricalCrossentropy()就不需要对标签one-hot编码
#metrics即度量标准:训练完对模型对数据的分类结果
model.compile(optimizer=tf.keras.optimizers.Adam(0.001),
             loss=tf.losses.SparseCategoricalCrossentropy(),
             metrics=[tf.keras.metrics.SparseCategoricalAccuracy()])

model.fit(x, y, epochs=5, batch_size=64,
          validation_data=(x_test, y_test))

猜你喜欢

转载自blog.csdn.net/weixin_43999137/article/details/104055323