import tensorflow as tf
import pandas as pd
import numpy as np
print(tf.__version__)
print(tf.test.is_gpu_available())
(train_image, train_label), (test_image, testlabel) = tf.keras.datasets.mnist.load_data()
# (60000, 28, 28)
# (60000,)
# (10000, 28, 28)
# print(train_image.shape)
# print(train_label.shape)
# print(test_image.shape)
# 数据处理
train_image = tf.cast(train_image / 255, tf.float64)
test_image = tf.cast(test_image / 255, tf.float64)
train_label = tf.cast(train_label, tf.int16)
testlabel = tf.cast(testlabel, tf.int16)
train_image = tf.reshape(train_image, (-1, 28, 28, 1))
test_image = tf.reshape(test_image, (-1, 28, 28, 1))
# (60000, 28, 28, 1)
# (60000,)
# print(train_image.shape)
# print(train_label.shape)
# 封装数据集
train_dataset = tf.data.Dataset.from_tensor_slices((train_image, train_label)).shuffle(train_image.shape[0]).batch(64)
test_dataset = tf.data.Dataset.from_tensor_slices((test_image, testlabel)).batch(64)
# 定义模型
model = tf.keras.Sequential([
tf.keras.layers.Conv2D(16, 3, 1, 'same', activation='relu', input_shape=(28, 28, 1)),
tf.keras.layers.Conv2D(32, 3, 1, 'same', activation='relu'),
tf.keras.layers.GlobalAveragePooling2D(),
tf.keras.layers.Dense(10)
])
print(model.summary())
# 定义优化器
optimizers_adam = tf.keras.optimizers.Adam()
# 定义损失函数
loss_func = tf.losses.SparseCategoricalCrossentropy(from_logits=True)
train_loss = tf.keras.metrics.Mean('train_loss')
train_acc = tf.keras.metrics.SparseCategoricalAccuracy('train_acc')
test_loss = tf.keras.metrics.Mean('test_loss')
test_acc = tf.keras.metrics.SparseCategoricalAccuracy('test_acc')
def train_step(model, image, label):
with tf.GradientTape() as t:
pred = model(image)
loss_step = loss_func(label, pred)
gradients = t.gradient(loss_step, model.trainable_variables)
optimizers_adam.apply_gradients(zip(gradients, model.trainable_variables))
# 求训练的平均损失与准确率
train_loss(loss_step)
train_acc(label, pred)
def test_step(model, image, label):
pred = model(image)
loss_step = loss_func(label, pred)
# 求测试的平均损失与准确率
test_loss(loss_step)
test_acc(label, pred)
def train():
for epoch in range(10):
for batch, (image, label) in enumerate(train_dataset):
train_step(model, image, label)
print('epoch {} train_loss: {} train_acc: {}'.format(epoch + 1, train_loss.result(), train_acc.result()))
for batch, (image, label) in enumerate(test_dataset):
test_step(model, image, label)
print('epoch {} test_loss: {} test_acc: {}'.format(epoch + 1, test_loss.result(), test_acc.result()))
train_loss.reset_states()
train_acc.reset_states()
test_loss.reset_states()
test_acc.reset_states()
if __name__ == '__main__':
train()
tensorflow2.0通过梯度下降法实现手写数字识别
最新推荐文章于 2022-08-12 19:01:50 发布