【问题标题】:Why trainable_variables Do not Change after Training?为什么 trainable_variables 在训练后不改变?
【发布时间】:2019-12-24 00:47:55
【问题描述】:

我过去了 a basic example of tf2.0

包含非常简单的代码

from __future__ import absolute_import, division, print_function, unicode_literals
import os

import tensorflow as tf

import cProfile

# Fetch and format the mnist data
(mnist_images, mnist_labels), _ = tf.keras.datasets.mnist.load_data()

dataset = tf.data.Dataset.from_tensor_slices(
  (tf.cast(mnist_images[...,tf.newaxis]/255, tf.float32),
   tf.cast(mnist_labels,tf.int64)))
dataset = dataset.shuffle(1000).batch(32)

# Build the model
mnist_model = tf.keras.Sequential([
  tf.keras.layers.Conv2D(16,[3,3], activation='relu',
                         input_shape=(None, None, 1)),
  tf.keras.layers.Conv2D(16,[3,3], activation='relu'),
  tf.keras.layers.GlobalAveragePooling2D(),
  tf.keras.layers.Dense(10)
])

for images,labels in dataset.take(1):
    print("Logits: ", mnist_model(images[0:1]).numpy())

optimizer = tf.keras.optimizers.Adam()
loss_object = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)

loss_history = []


def train_step(model, images, labels):

    with tf.GradientTape() as tape:
        logits = model(images, training=True)

        # Add asserts to check the shape of the output.
        tf.debugging.assert_equal(logits.shape, (32, 10))

        loss_value = loss_object(labels, logits)

    loss_history.append(loss_value.numpy().mean())
    grads = tape.gradient(loss_value, model.trainable_variables)
    optimizer.apply_gradients(zip(grads, model.trainable_variables))


def train(epochs):
  for epoch in range(epochs):
    for (batch, (images, labels)) in enumerate(dataset):
      train_step(mnist_model, images, labels)
    print ('Epoch {} finished'.format(epoch))

我通过以下方式对其进行了训练并在前后保存了trainable_variables


t0=mnist_model.trainable_variables  
train(epochs = 3)
t1=mnist_model.trainable_variables
diff = tf.reduce_mean(tf.abs(t0[0] - t1[0])) 
# whethere indexing [0] or [1] etc. gets the same outcome of diff
print(diff.numpy())

他们是一样的!!! 那么我检查的地方不正确吗?如果是这样,我怎样才能正确观察这些更新的变量?

【问题讨论】:

    标签: tensorflow2.0 eager-execution


    【解决方案1】:

    您不是在创建新的变量数组,而是在同一个对象上创建 2 个指针 尝试这样做

    t0 = np.array(mnist_model.trainable_variables)
    

    【讨论】:

    • 是一样的。然而,如果我使用 optrimizer.get_weights() 获取它们并在每个训练步骤或时期之前和之后对它们进行比较。我可以看到变化。但是我仍然不明白为什么我不能使用 trainable_variables。
    猜你喜欢
    • 2021-03-19
    • 2019-11-25
    • 2020-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-04
    相关资源
    最近更新 更多