TensorFlow 2.0 - Подклассы моделей: нет входного измерения - PullRequest
0 голосов
/ 08 февраля 2020

Я читал TensorFlow 2.0 Tutorial и наткнулся на подклассы моделей для создания моделей TensorFlow 2.0.

Код, который я нашел:

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)

# Create an instance of the model
model = MyModel()

Сейчас в этом коде моя путаница в том, что автор кода не определяет входные данные?

Нет -

self.input_layer = Input(
            shape = (28, 28)
            )

# OR-

self.conv1 = Conv2D(32, 3, activation='relu', input_dim = (28, 28)

Как определенная модель узнает, сколько атрибутов / особенности ожидать от данных обучения?

Спасибо

1 Ответ

1 голос
/ 08 февраля 2020

По словам Франсуа Шоле, ответ на ваш вопрос следующий (при сравнении (Функциональное + последовательное и API модели):

Вы можете делать все эти вещи (печать форм ввода / вывода) ) в функциональной или последовательной модели, потому что эти модели представляют собой статические графы слоев c.

Напротив, подклассовая модель представляет собой фрагмент кода Python (метод вызова). Графов нет Слои здесь. Мы не можем знать, как слои связаны друг с другом (потому что это определено в теле вызова, а не как явная структура данных), поэтому мы не можем вывести формы ввода / вывода

Многое более подробное объяснение этих 3 типов доступно здесь: https://medium.com/tensorflow/what-are-symbolic-and-imperative-apis-in-tensorflow-2-0-dfccecb01021

Пример того, как вы можете все еще достичь этого путем смешивания API + функционального подкласса модели, приведен здесь (кредиты ixez на GitHub ):

import tensorflow as tf
from tensorflow.keras.layers import Input

class MyModel(tf.keras.Model):
    def __init__(self):
        super().__init__()
        self.dense = tf.keras.layers.Dense(1)

    def call(self, inputs, **kwargs):
        return self.dense(inputs)

    def model(self):
        x = Input(shape=(1))
        return Model(inputs=[x], outputs=self.call(x))

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