前向传播
Sequential 容器封装成一个网络大类对象,调用大类的前向计算函数一次即可完成所有层的前向计算。
# 导入常用网络层 layers from tensorflow.keras import layers,Sequential # 隐藏层 1 fc1 = layers.Dense(256, activation=tf.nn.relu) # 隐藏层 2 fc2 = layers.Dense(128, activation=tf.nn.relu) # 隐藏层 3 fc3 = layers.Dense(64, activation=tf.nn.relu) # 输出层 fc4 = layers.Dense(10, activation=None) x = tf.random.normal([4,28*28]) # 通过隐藏层 1 得到输出 h1 = fc1(x) # 通过隐藏层 2 得到输出 h2 = fc2(h1) # 通过隐藏层 3 得到输出 h3 = fc3(h2) # 通过输出层得到网络输出 h4 = fc4(h3)
# 导入 Sequential 容器 from tensorflow.keras import layers,Sequential # 通过 Sequential 容器封装为一个网络类 model = Sequential([ layers.Dense(256, activation=tf.nn.relu) , # 创建隐藏层 1 layers.Dense(128, activation=tf.nn.relu) , # 创建隐藏层 2 layers.Dense(64, activation=tf.nn.relu) , # 创建隐藏层 3 layers.Dense(10, activation=None) , # 创建输出层 ])
out = model(x) # 前向计算得到输出
梯度计算
with tf.GradientTape() as tape: # 梯度记录器 # x: [b, 28*28] # 隐藏层 1 前向计算, [b, 28*28] => [b, 256] h1 = x@w1 + tf.broadcast_to(b1, [x.shape[0], 256]) h1 = tf.nn.relu(h1) # 隐藏层 2 前向计算, [b, 256] => [b, 128] h2 = h1@w2 + b2 h2 = tf.nn.relu(h2) # 隐藏层 3 前向计算, [b, 128] => [b, 64] h3 = h2@w3 + b3 h3 = tf.nn.relu(h3) # 输出层前向计算, [b, 64] => [b, 10] h4 = h3@w4 + b4