Я пытаюсь кормить последовательную модель партиями. Чтобы воспроизвести мой пример, предположим, что мои данные:

X = np.random.rand(432,24,1)
Y = np.random.rand(432,24,1)

Моя цель - кормить модель партиями. 24 точки за раз (вектор 24 x 1), 432 раза.

Я построил свою модель как:

X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.3, random_state=12)

model = keras.Sequential([
    #keras.layers.Flatten(batch_input_shape=(None, 432, 2)),
    keras.layers.Dense(64, activation=tf.nn.relu),
    keras.layers.Dense(2, activation=tf.nn.sigmoid),
])

model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])

history = model.fit(X_train, y_train, epochs=200, batch_size=32, validation_split=0.3)
test_loss, test_acc = model.evaluate(X_test, y_test)
print('Model loss:', test_loss, 'Model accuracy: ', test_acc)

Однако я получаю эту ошибку:

ValueError: вход 0 слоя density_25 несовместим со слоем: ожидаемая ось -1 входной формы должна иметь значение 864, но получен вход с фигурой (None, 432)

enter image description here

1
Lash 15 Окт 2021 в 18:55

2 ответа

Лучший ответ

Я не совсем уверен, что вы хотите сделать, но вот рабочий пример:

import tensorflow as tf
from sklearn.model_selection import train_test_split

X = np.random.rand(432, 24)
Y = np.random.randint(2, size=(432, 2))

X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.3, random_state=12)

model = tf.keras.Sequential([
    tf.keras.layers.Dense(64, activation=tf.nn.relu),
    tf.keras.layers.Dense(2, activation=tf.nn.sigmoid),
])

model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])

history = model.fit(X_train, y_train, epochs=200, batch_size=32, validation_split=0.3)
test_loss, test_acc = model.evaluate(X_test, y_test)
print('Model loss:', test_loss, 'Model accuracy: ', test_acc)

Обратите внимание, что ваши данные X имеют форму (432, 24), а ваши ярлыки Y имеют форму (432, 2). Я удалил ваш слой Flatten, поскольку он не имеет особого смысла, если ваши данные имеют форму (432, 24). Вы можете сделать прогноз после обучения своей модели следующим образом:

X_new = np.random.rand(1, 24)
Y_new = model.predict(X_new)
print(Y_new)
1
AloneTogether 15 Окт 2021 в 18:43

Я думаю, что есть некоторая путаница в размерах ваших входных данных. Я собираюсь предположить, что 432 - это количество точек, и каждая точка данных имеет размерность 24 (т.е. 24 характеристики). В этом случае первое измерение должно проиндексировать точки, потому что и scikit-learn, и keras ожидают этого. Например,

X = np.random.rand(432, 24)
Y = np.random.rand(432, 24)

Тогда ваш код должен запуститься, если вы соответствующим образом исправите форму ввода,

model = keras.Sequential([
    keras.layers.Flatten(batch_input_shape=(None, 24)),
    keras.layers.Dense(64, activation=tf.nn.relu),
    keras.layers.Dense(2, activation=tf.nn.sigmoid),
])
1
ATony 15 Окт 2021 в 16:49