Tensorflow 2.0 Beta: Model.fit () выдает ValueError: аргументы и аргументы подписи не совпадают: 56 57

Я новичок в машинном обучении. Я пытаюсь создать простую RNN в Tensorflow 2.0, но наткнулся на препятствие. Я свел его к минимальному примеру, который воспроизводит проблему. Цель этого минимального примера состоит в том, чтобы RNN научилась многократно выводить 1.0.

import os
import sys
import math
from random import shuffle
import numpy as np
import tensorflow as tf
from time import time as time

epochs = 200
batch_size = 32
chunk_length = 64
features = 10

def main():
    train_dataset = np.zeros([batch_size, chunk_length, features]) + 1
    test_dataset = np.zeros([batch_size, chunk_length, features]) + 1

    with tf.device('/gpu:0'):
        model = tf.keras.Sequential([
            tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(
                64, return_sequences=True)),
            tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(32)),
            tf.keras.layers.Dense(64, activation='relu'),
            tf.keras.layers.Dense(1, activation='sigmoid')
        ])
        model.compile(loss='mean_absolute_error',
            optimizer='adam',
            metrics=['accuracy'])

        history = model.fit(train_dataset, batch_size=batch_size, epochs=epochs)

        test_loss, test_acc = model.evaluate(test_dataset)

        print('Test Loss: {}'.format(test_loss))
        print('Test Accuracy: {}'.format(test_acc))

if __name__ == '__main__':
    main()

Когда я запускаю это, я получаю ValueError: Arguments and signature arguments do not match: 56 57. Если я закомментирую последний слой, я получу ValueError: Arguments and signature arguments do not match: 50 51. Если я закомментирую последние два слоя, я получу ValueError: Arguments and signature arguments do not match: 44 45.

Я попытался изменить все предоставляемые мной константы (эпохи, размер_пакета, длина_груба и функции), но они не повлияли на ошибку. Я также попытался удалить поэлементное добавление 1 к массивам numpy, но это тоже не повлияло.

Это ошибка в TensorFlow или я делаю глупость?


person Joshua Walsh    schedule 12.06.2019    source источник


Ответы (2)


Я использую тензорный поток версии 1.13.1 и без графического процессора, но, надеюсь, это все еще решает проблемы. Похоже, вы вводите только свои входные данные сети (x), но не отвечаете (y). Так что модели нечему учиться. Я только добавил данные ответа train_Y_dataset и test_Y_dataset. Следующий код работал у меня в tensorflow 1.13.1, см. Комментарий для изменений:

import os
import sys
import math
from random import shuffle
import numpy as np
import tensorflow as tf
from time import time as time

epochs = 200 batch_size = 32 chunk_length = 64 features = 10 def main(): train_X_dataset = np.zeros([batch_size, chunk_length, features]) + 1 # add train_Y_dataset: train_Y_dataset = np.zeros([batch_size, 1]) + 1 test_X_dataset = np.zeros([batch_size, chunk_length, features]) + 1 # add test_Y_dataset: test_Y_dataset = np.zeros([batch_size, 1]) + 1 #1 #with tf.device('/gpu:0'): model = tf.keras.Sequential([ tf.keras.layers.Bidirectional(tf.keras.layers.LSTM( 64, return_sequences=True)), tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(32)), tf.keras.layers.Dense(64, activation='relu'), tf.keras.layers.Dense(1, activation='sigmoid') ]) model.compile(loss='mean_absolute_error', optimizer='adam', metrics=['accuracy']) # add the response variable train_Y_dataset in fit history = model.fit(x=train_X_dataset, y=train_Y_dataset, batch_size=batch_size, epochs=epochs) # add the response variable test_Y_dataset in evaluate test_loss, test_acc = model.evaluate(x=test_X_dataset, y=test_Y_dataset) print('Test Loss: {}'.format(test_loss)) print('Test Accuracy: {}'.format(test_acc)) if __name__ == '__main__': main()
person KrisR89    schedule 12.06.2019
comment
Ах, это определенно может показаться моей проблемой. Почему форма X [batch_size, chunk_length, features] и форма Y [batch_size, last_layer_units]? Можно ли сделать Y такой же формы, как X? (Я хочу, чтобы мои выходные данные были той же длины, что и входные) - person Joshua Walsh; 12.06.2019
comment
Ваш последний слой LSTM использовал return_sequences = False (по умолчанию), поэтому для каждой партии будет только один вывод, следовательно, форма Y [batch_size, 1]. Если вместо этого вам нужен один прогноз для каждого time_step, вы также можете добавить return_sequences = True для вашего последнего LSTM и установить Y равным np.zeros ([batch_size, chunk_length, 1]) + 1 - person KrisR89; 12.06.2019

Помните, что такие функции, как model.fit() и model.evaluate(), требуют передачи меток.

person orangecaterpillar    schedule 08.07.2019