ValueError: Tensor («cnn / conv2d / kernel: 0», shape = (), dtype = resource) должен быть из того же графика, что и Tensor («Placeholder: 0», shape = (), dtype = option) - PullRequest
0 голосов
/ 02 апреля 2020

Я новичок в области глубокого обучения и TFF. Мне нужно использовать CNN для классификации изображений из EMNIST. И я вижу учебники на GitHub под названием Федеративное обучение для классификации изображений. Я создаю сеть с именем CNN, а затем использую функцию forward_pass для создания модели cnn для расчета прогнозов. Но TFF должен передать переменные модели в качестве обучаемых переменных в tff.learning.Model. Я печатаю модель CNN. Переменные. Я не знаю, как их назвать, поэтому я использую cnn_conv2d_kernel для представления cnn / conv2d / kernel. Вот мой код:

напечатанные переменные model.variable:

variables: [<tf.Variable 'cnn/conv2d/kernel:0' shape=(5, 5, 1, 32) dtype=float32>, <tf.Variable 'cnn/conv2d/bias:0' shape=(32,) dtype=float32>, <tf.Variable 'cnn/conv2d_1/kernel:0' shape=(5, 5, 32, 64) dtype=float32>, <tf.Variable 'cnn/conv2d_1/bias:0' shape=(64,) dtype=float32>, <tf.Variable 'cnn/dense/kernel:0' shape=(3136, 1024) dtype=float32>, <tf.Variable 'cnn/dense/bias:0' shape=(1024,) dtype=float32>, <tf.Variable 'cnn/dense_1/kernel:0' shape=(1024, 10) dtype=float32>, <tf.Variable 'cnn/dense_1/bias:0' shape=(10,) dtype=float32>]

Мои переменные созданы для передачи обучаемых и non_trainable переменных в tff.learning.Model:

MnistVariables = collections.namedtuple(
'MnistVariables','cnn_conv2d_kernel cnn_conv2d_bias cnn_conv2d_1_kernel cnn_conv2d_1_bias cnn_dense_kernel cnn_dense_bias cnn_dense_1_kernel cnn_dense_1_bias num_examples loss_sum accuracy_sum'

)

def create_mnist_variables():
  return MnistVariables(
      # weights=tf.Variable(
      #     # lambda: tf.zeros(dtype=tf.float32, shape=(784,10)),
      #     lambda: tf.zeros(dtype=tf.float32, shape=(28,28,10)),
      #     name='weights',
      #     trainable=True),
      # bias=tf.Variable(
      #     lambda: tf.zeros(dtype=tf.float32, shape=(10)),
      #     name='bias',
      #     trainable=True),

      cnn_conv2d_kernel=tf.Variable(
          # lambda: tf.zeros(dtype=tf.float32, shape=(784,10)),
          lambda: tf.zeros(dtype=tf.float32, shape=(5,5,1,32)),
          name='cnn_conv2d_kernel',
          trainable=True),
      cnn_conv2d_bias=tf.Variable(
          # lambda: tf.zeros(dtype=tf.float32, shape=(784,10)),
          lambda: tf.zeros(dtype=tf.float32, shape=(32,)),
          name='cnn_conv2d_bias',
          trainable=True),
      cnn_conv2d_1_kernel=tf.Variable(
          # lambda: tf.zeros(dtype=tf.float32, shape=(784,10)),
          lambda: tf.zeros(dtype=tf.float32, shape=(5,5,32,64)),
          name='cnn_conv2d_1_kernel',
          trainable=True),
      cnn_conv2d_1_bias=tf.Variable(
          # lambda: tf.zeros(dtype=tf.float32, shape=(784,10)),
          lambda: tf.zeros(dtype=tf.float32, shape=(64,)),
          name='cnn_conv2d_1_bias',
          trainable=True),
      cnn_dense_kernel=tf.Variable(
          # lambda: tf.zeros(dtype=tf.float32, shape=(784,10)),
          lambda: tf.zeros(dtype=tf.float32, shape=(3136,1024)),
          name='cnn_dense_kernel',
          trainable=True),
      cnn_dense_bias=tf.Variable(
          # lambda: tf.zeros(dtype=tf.float32, shape=(784,10)),
          lambda: tf.zeros(dtype=tf.float32, shape=(1024,)),
          name='cnn_dense_bias',
          trainable=True),
      cnn_dense_1_kernel=tf.Variable(
          # lambda: tf.zeros(dtype=tf.float32, shape=(784,10)),
          lambda: tf.zeros(dtype=tf.float32, shape=(1024,10)),
          name='cnn_dense_1_kernel',
          trainable=True),
      cnn_dense_1_bias=tf.Variable(
          # lambda: tf.zeros(dtype=tf.float32, shape=(784,10)),
          lambda: tf.zeros(dtype=tf.float32, shape=(10,)),
          name='cnn_dense_1_bias',
          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)
  )

мой частичный tff.learning.Model код:

class MnistModel(tff.learning.Model):

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

  #所有的“tf.Variables”都应该在“__init__”中引入
  @property
  def trainable_variables(self):
    #return [self._variables.weights, self._variables.bias]
    return [self._variables.cnn_conv2d_kernel,
        self._variables.cnn_conv2d_bias,
        self._variables.cnn_conv2d_1_kernel,
        self._variables.cnn_conv2d_1_bias,
        self._variables.cnn_dense_kernel,
        self._variables.cnn_dense_bias,
        self._variables.cnn_dense_1_kernel,
        self._variables.cnn_dense_1_bias
        ]

пожалуйста, прости мой бедный Энгли sh и помоги мне, пожалуйста. (Пожалуйста)

Теперь у меня есть новая проблема:

ValueError: No gradients provided for any variable: ['cnn_conv2d_kernel:0', 'cnn_conv2d_bias:0', 'cnn_conv2d_1_kernel:0', 'cnn_conv2d_1_bias:0', 'cnn_dense_kernel:0', 'cnn_dense_bias:0', 'cnn_dense_1_kernel:0', 'cnn_dense_1_bias:0'].

1 Ответ

0 голосов
/ 04 апреля 2020

Для этого случая использования может быть проще, чем создавать подкласс tff.learning.Model напрямую, чтобы написать tf.keras.Model и использовать утилиты TFF для преобразования этого в tff.learning.Model.

Есть несколько примеров выполнения именно этого в исследовательском коде, размещенном в TFF; один такой указатель здесь . Этот указатель на чистую модель Кераса; чтобы использовать это в TFF, мы должны использовать функцию tff.learning.from_keras_model, связанную выше. Если у вас есть tf.data.Dataset ds, который содержит ваши изображения и метки, и функцию потери loss_fn, вы можете получить tff.learning.model, позвонив по телефону:

keras_model = create_keras_model()
tff_model = tff.learning.from_keras_model(
    keras_model=keras_model, loss=loss_fn, input_spec=ds.element_spec)

Непосредственно подклассифицируя tff.learning.Model - особенность опытного пользователя; Например, вы захотите написать собственный TensorFlow для определения прямого прохода Для начала глубокого обучения в целом и TFF в частности, я бы рекомендовал использовать высокоуровневый API, такой как tf.keras и утилиты Keras в TFF, как описано выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...