【问题标题】:change model in tensorflow-federated but not work在 tensorflow 联合中更改模型但不起作用
【发布时间】:2019-08-20 20:48:44
【问题描述】:

我尝试在 Federated Learning for Image Classification 的教程中更改模型(只是和隐藏层)。但结果表明 w1 和 b1 在多次迭代后没有变化并保持初始值 0。在训练中只有 w2 和 b2 是可训练的。这是我的代码:

MnistVariables = collections.namedtuple(
    'MnistVariables', 'w1 w2 b1 b2 num_examples loss_sum accuracy_sum')


def create_mnist_variables():
    return MnistVariables(
        w1=tf.Variable(
            lambda: tf.zeros(dtype=tf.float32, shape=(784, 128)),
            name='w1',
            trainable=True),
        w2=tf.Variable(
            lambda: tf.zeros(dtype=tf.float32, shape=(128, 10)),
            name='w2',
            trainable=True),
        b1=tf.Variable(
            lambda: tf.zeros(dtype=tf.float32, shape=(128)),
            name='b1',
            trainable=True),
        b2=tf.Variable(
            lambda: tf.zeros(dtype=tf.float32, shape=(10)),
            name='b2',
            trainable=True),
        num_examples=tf.Variable(0.0, name='num_examples', trainable=False),
        loss_sum=tf.Variable(0.0, name='loss_sum', trainable=False),
        accuracy_sum=tf.Variable(0.0, name='accuracy_sum', trainable=False))


def mnist_forward_pass(variables, batch):
    a = tf.add(tf.matmul(batch['x'], variables.w1) , variables.b1)
    a= tf.nn.relu(a)
    y = tf.nn.softmax(tf.add(tf.matmul(a, variables.w2),variables.b2))
    predictions = tf.cast(tf.argmax(y, 1), tf.int32)

    flat_labels = tf.reshape(batch['y'], [-1])
    loss = -tf.reduce_mean(tf.reduce_sum(
        tf.one_hot(flat_labels, 10) * tf.log(y), reduction_indices=[1]))
    accuracy = tf.reduce_mean(
        tf.cast(tf.equal(predictions, flat_labels), tf.float32))

    num_examples = tf.to_float(tf.size(batch['y']))

    tf.assign_add(variables.num_examples, num_examples)
    tf.assign_add(variables.loss_sum, loss * num_examples)
    tf.assign_add(variables.accuracy_sum, accuracy * num_examples)

    return loss, predictions


def get_local_mnist_metrics(variables):
    return collections.OrderedDict([
        ('w1', variables.w1),
        ('w2', variables.w2),
        ('b1', variables.b1),
        ('b2', variables.b2),
        ('num_examples', variables.num_examples),
        ('loss', variables.loss_sum / variables.num_examples),
        ('accuracy', variables.accuracy_sum / variables.num_examples)
        ])

class MnistModel(tff.learning.Model):

    def __init__(self):
        self._variables = create_mnist_variables()

    @property
    def trainable_variables(self):
        return [self._variables.w1, self._variables.w2,
                self._variables.b1, self._variables.b2]

我还在可训练变量中添加了 w2 和 b2。但似乎他们在训练过程中没有受过训练,我也不知道为什么。有没有人有一些成功的经验来改变这个教程中的模型?

【问题讨论】:

  • 能否添加您对class MnistTrainableModel 所做的更改以及MnistVariables 的定义?
  • 是的。我将它们添加到 MnistTrainableModel 类的 def trainable_variables 和 def create_mnist_variables() 中的 MnistVariables
  • 您能否编辑原始问题以包含对教程所做的所有更改(例如对def trainable_variables 的更改)?
  • 好的。我已经重新编辑了它。谢谢!

标签: tensorflow-federated


【解决方案1】:

我怀疑具有 w1b1 的零初始化的 ReLU 激活是有问题的,这可能是“垂死的 ReLU”的情况(请参阅 What is the “dying ReLU” problem in neural networks?

由于w1b1 被初始化为零,我希望在矩阵乘法和加法之后输出也为0

尝试的可能选项:使用非零初始化器,使用替代激活函数(或在第一层之后没有激活)。

【讨论】:

    猜你喜欢
    • 2023-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多