我想使用经过训练的模型来更改输入,以便在Tensorflow 2.0中进行深度梦想时将损失降到最低(而不是更改可训练的变量),但是我没有成功。
说我在文档中有一个基本的NN
class MyModel(Model):
def __init__(self):
super(MyModel, self).__init__()
self.conv1 = Conv2D(32, 3, activation='relu')
self.flatten = Flatten()
self.d1 = Dense(128, activation='relu')
self.d2 = Dense(10, activation='softmax')
def call(self, x):
x = self.conv1(x)
x = self.flatten(x)
x = self.d1(x)
return self.d2(x)
model = MyModel()
我使用简单的tf.GradientTape函数进行训练
@tf.function
def train_step(image, label):
with tf.GradientTape() as tape:
predictions = model(image)
loss = loss_object(label, predictions)
gradients = tape.gradient(loss, model.trainable_variables)
optimizer.apply_gradients(zip(gradients, model.trainable_variables))
创建函数的惯用方式是什么,它将代之以计算渐变并将渐变应用于输入-图像。
我以为它会简单到
def train_step(image, label):
with tf.GradientTape() as tape:
predictions = model(image)
loss = loss_object(label, predictions)
gradients = tape.gradient(loss, image)
optimizer.apply_gradients(zip(gradients, image))
但是,这不起作用。
答案 0 :(得分:2)
tf.GradientTape.gradients
只能将wrt与观察到的张量区分开。首次访问时会自动监视变量。为了区分任意张量,必须显式watch
:
>>> x = tf.constant([4.0])
>>> y = tf.constant([2.0])
>>> with tf.GradientTape() as tape:
... tape.watch([x, y])
... z = x * y
...
>>> tape.gradient(z, [x, y])
[<tf.Tensor: id=9, shape=(1,), dtype=float32, numpy=array([ 2.], dtype=float32)>,
<tf.Tensor: id=10, shape=(1,), dtype=float32, numpy=array([ 4.], dtype=float32)>]