数据集:MNIST,包含0~9共10种数字的手写图片。每种数字7000张,共70000张,这里60000张训练,10000张测试。
建立的网络结构:
重复堆叠多次变换以增加其表达能力(逼近复杂分布的能力):
relu是激活函数,将线性模型转换为非线性模型:
代码:
import tensorflow as tf
#导入tf子库
from tensorflow.keras import layers,optimizers,datasets,Sequential,metrics
#设置gpu使用方式
#获取gpu列表
gpus=tf.config.experimental.list_physical_devices('GPU')
if gpus:
try:
#设置gpu为增长式占用
for gpu in gpus:
tf.config.experimental.set_memory_growth(gpu,True)
except RuntimeError as e:
#打印异常
print(e)
(xs,ys),_=datasets.mnist.load_data()#加载mnist数据集 _表示没有测试集 只用60k训练集
print('datasets:',xs.shape,ys.shape,xs.min(),xs.max())
batch_size=32#批尺寸,一次选择32张
xs=tf.convert_to_tensor(xs,dtype=tf.float32)/255.#转换为浮点张量并缩放到-1~1
db=tf.data.Dataset.from_tensor_slices((xs,ys))#对数据切片
db=db.batch(batch_size).repeat(30)#迭代30次
#用Sequential建立3层神经网络模型
model=Sequential([
#3个非线性层的嵌套模型
layers.Dense(256,activation='relu'),#隐藏层1,relu为非线性函数
layers.Dense(128,activation='relu'),#隐藏层2
layers.Dense(10)])#输出层,输出节点为10
model.build(input_shape=(4,28*28))
model.summary()#显示神经网络架构
optimizer=optimizers.SGD(learning_rate=0.001)
acc_meter=metrics.Accuracy()
for step,(x,y) in enumerate(db):
with tf.GradientTape() as tape:#构建梯度记录环境
#打平操作[b,28,28]->[b,784]
x=tf.reshape(x,(-1,28*28))
#step1,得到模型输出 output [b,784]->[b,10]
out=model(x)
#[b]->[b,10]
y_onehot=tf.one_hot(y,depth=10)
#step2
#计算差的平方和
loss=tf.square(out-y_onehot)
#计算每个样本的平均误差
loss=tf.reduce_sum(loss)/x.shape[0]
acc_meter.update_state(tf.argmax(out,axis=1),y)
# step3, 计算参数的梯度w1,w2,w3,b1,b2,b3
grads = tape.gradient(loss, model.trainable_variables)#作用见下
# 更新网络参数 w'=w-lr*grad
optimizer.apply_gradients(zip(grads, model.trainable_variables))
if step%200==0:
print(step,'loss:',float(loss),'acc:',acc_meter.result().numpy())
acc_meter.reset_states()
tape.gradient():
执行结果:
from 《TensorFlow深度学习》 龙良曲