使用 GradientTape 训练基本的 TensorFlow 模型
Training a basic TensorFlow Model using the GradientTape
仅出于教育目的,我试图在 TensorFlow 主页上的 Basic training loops 教程的基础上创建一个简单的神经网络来对平面中的点进行分类。
所以,我在 [0,1]x[0,1]
中的一些点存储在形状 (250, 2, 1)
的张量 x
中,相应的标签 (1. or 0.)
存储在张量 y
的形状 (250,1,1)
。那我做
import tensorflow as tf
w0 = tf.Variable(tf.random.normal([4,2]), name = 'w0')
w1 = tf.Variable(tf.random.normal([1,4]), name = 'w1')
b1 = tf.Variable(tf.zeros([4,1]), name = 'b1')
b2 = tf.Variable(tf.zeros([1,1]), name = 'b2')
loss = tf.keras.losses.CategoricalCrossentropy()
def forward(x):
x0 = x
z1 = tf.matmul(w0, x0) + b1
x1 = tf.nn.relu(z1)
z2 = tf.matmul(w1, x1) + b2
x2 = tf.nn.sigmoid(z2)
return x2
with tf.GradientTape() as t:
current_loss = loss(y, forward(x))
gradients = t.gradient(current_loss, [b1, b2, w0, w1])
我得到的是预期形状但仅包含零的张量列表。有人有什么建议吗?
出现此问题是因为 labels/predictions 没有预期的形状。特别是,损失函数 tf.keras.losses.CategoricalCrossentropy 期望以单热表示形式提供标签,但您的标签和预测具有 (250, 1, 1)
形状,并且在这种情况下损失函数的行为不清楚。使用 tf.keras.losses.BinaryCrossentropy
相反应该可以解决问题。
仅出于教育目的,我试图在 TensorFlow 主页上的 Basic training loops 教程的基础上创建一个简单的神经网络来对平面中的点进行分类。
所以,我在 [0,1]x[0,1]
中的一些点存储在形状 (250, 2, 1)
的张量 x
中,相应的标签 (1. or 0.)
存储在张量 y
的形状 (250,1,1)
。那我做
import tensorflow as tf
w0 = tf.Variable(tf.random.normal([4,2]), name = 'w0')
w1 = tf.Variable(tf.random.normal([1,4]), name = 'w1')
b1 = tf.Variable(tf.zeros([4,1]), name = 'b1')
b2 = tf.Variable(tf.zeros([1,1]), name = 'b2')
loss = tf.keras.losses.CategoricalCrossentropy()
def forward(x):
x0 = x
z1 = tf.matmul(w0, x0) + b1
x1 = tf.nn.relu(z1)
z2 = tf.matmul(w1, x1) + b2
x2 = tf.nn.sigmoid(z2)
return x2
with tf.GradientTape() as t:
current_loss = loss(y, forward(x))
gradients = t.gradient(current_loss, [b1, b2, w0, w1])
我得到的是预期形状但仅包含零的张量列表。有人有什么建议吗?
出现此问题是因为 labels/predictions 没有预期的形状。特别是,损失函数 tf.keras.losses.CategoricalCrossentropy 期望以单热表示形式提供标签,但您的标签和预测具有 (250, 1, 1)
形状,并且在这种情况下损失函数的行为不清楚。使用 tf.keras.losses.BinaryCrossentropy
相反应该可以解决问题。