我正试图在TensorFlow网站上关注this example,但是它不起作用。
这是我的代码:
import tensorflow as tf
def vectorize(vector_like):
return tf.convert_to_tensor(vector_like)
def batchify(vector):
'''Make a batch out of a single example'''
return vectorize([vector])
data = [(batchify([0]), batchify([0, 0, 0])), (batchify([1]), batchify([0, 0, 0])), (batchify([2]), batchify([0, 0, 0]))]
num_hidden = 5
num_classes = 3
opt = tf.keras.optimizers.SGD(learning_rate=0.1)
model = tf.keras.Sequential()
model.add(tf.keras.layers.Dense(num_hidden, activation='relu'))
model.add(tf.keras.layers.Dense(num_classes, activation='sigmoid'))
loss_fn = lambda: tf.keras.backend.cast(tf.keras.losses.mse(model(input), output), tf.float32)
var_list_fn = lambda: model.trainable_weights
for input, output in data:
opt.minimize(loss_fn, var_list_fn)
有一阵子,我收到有关损失函数具有错误数据类型(int而不是float)的警告,这就是为什么我将强制类型转换添加到损失函数的原因。
我没有得到网络培训,而是得到了错误消息:
ValueError:没有为任何变量提供渐变: ['sequential / dense / kernel:0','sequential / dense / bias:0', 'sequential / dense_1 / kernel:0','sequential / dense_1 / bias:0']。
为什么没有通过渐变?我在做什么错了?
答案 0 :(得分:2)
如果要在TF2中操纵渐变,则需要使用GradientTape
。例如,以下作品。
opt = tf.keras.optimizers.SGD(learning_rate=0.1)
model = tf.keras.Sequential()
model.add(tf.keras.layers.Dense(num_hidden, activation='relu'))
model.add(tf.keras.layers.Dense(num_classes, activation='sigmoid'))
with tf.GradientTape() as tape:
loss = tf.keras.backend.mean(tf.keras.losses.mse(model(input),tf.cast(output, tf.float32)))
gradients = tape.gradient(loss, model.trainable_variables)
opt.apply_gradients(zip(gradients, model.trainable_variables))
修改:
通过以下更改,您实际上可以使您的示例工作。
loss_fn
(请注意,当我们优化损失平均值时,我也在做mean
)通过“工作”,我的意思是它没有抱怨。但是您需要进一步调查以确保其按预期工作。
loss_fn = lambda: tf.keras.backend.mean(tf.keras.losses.mse(model(input), tf.cast(output, tf.float32)))
var_list_fn = lambda: model.trainable_weights
opt.minimize(loss_fn, var_list_fn)