Ошибка TypeError: __init __ () принимает как минимум 3 аргумента (дано 2) при создании подкласса класса Model - PullRequest
0 голосов
/ 03 февраля 2019

Я хочу создать простую нейронную сеть, используя Tensorflow и Keras.Когда я пытаюсь создать экземпляр Model, создав подкласс класса Model

class TwoLayerFC(tf.keras.Model):
    def __init__(self, hidden_size, num_classes):
        super(TwoLayerFC, self).__init__()
        self.fc1 = keras.layers.Dense(hidden_size,activation=tf.nn.relu)
        self.fc2 = keras.layers.Dense(num_classes)


    def call(self, x, training=None):
        x = tf.layers.flatten(x)
        x = self.fc1(x)
        x = self.fc2(x)

        return x

, я проверяю сеть

def test_TwoLayerFC():
    tf.reset_default_graph()
    input_size, hidden_size, num_classes = 50, 42, 10
    model = TwoLayerFC(hidden_size, num_classes)
    with tf.device(device):
        x = tf.zeros((64, input_size))
        scores = model(x)

    with tf.Session() as sess:
        sess.run(tf.global_variables_initializer())
        scores_np = sess.run(scores)
        print(scores_np.shape)

. Я получаю сообщение об ошибке:

TypeError: init () принимает как минимум 3 аргумента (2 дано)

Я следовал этому учебнику, и, похоже, должно быть два параметра.

1 Ответ

0 голосов
/ 04 февраля 2019

Я прочитал ваш код и вижу, что создается модель PyTorch, включая ошибку во втором Dense слое с двумя пропущенными числами.

Модели Keras не должны следовать той же логике моделей PyTorch.

Эта модель должна быть создана следующим образом:

input_tensor = Input(input_shape)
output_tensor = Flatten()(input_tensor)
output_tensor = Dense(hidden_size, activation='relu')(output_tensor)
output_tensor = Dense(num_classes)

model = keras.models.Model(input_tensor, output_tensor)

Этот экземпляр model готов к компиляции и обучению:

 model.compile(optimizer=..., loss = ..., metrics=[...])
 model.fit(x_train, y_train, epochs=..., batch_size=..., ...)

Нет причин дляКерас для подкласса Model, если только вы не очень продвинутый пользователь, пробующий какие-то очень необычные вещи.

Кстати, будьте осторожны, чтобы не смешать tf.keras.anything с keras.anything.Первая - это версия Keras, созданная напрямую с помощью tenorflow, а вторая - оригинальная Keras.Они не совсем одинаковые, версия тензорного потока кажется более глючной, и смешивание двух в одном коде звучит как плохая идея.

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