Построение RNN с помощью Tensorflow. Как мне правильно предварительно обработать мой набор данных, чтобы он соответствовал входной и выходной форме RNN?

Я работаю над проектом по обнаружению барабанных ударов по звуку. В настоящее время я предварительно обработал свои обучающие данные и попытался собрать нейронную сеть SimpleRNN в тензорном потоке, но не смог заставить их работать вместе.

На каждом временном шаге мои входные данные состоят из одномерного тензора формы (84), а на выходе должен быть тензор формы (3).

В настоящее время мой код выглядит так:

train_epochs = 10
batch_num = 10
learning_Rate = 0.001

''' I also tried using tf.dataset but couldn't get it to work
train_dataset = dataset.batch(batch_num, drop_remainder=True)
test_dataset = dataset.take(10000).batch(batch_num, drop_remainder=True)
print(train_dataset.element_spec)
'''
x_data = x_data[:70000]
y_data = y_data[:70000]
x_data.resize((70000, 84))
y_data.resize((70000, 3))
print(x_data.shape, y_data.shape) 

model = keras.Sequential()
model.add(keras.Input(shape=(None,84)))
model.add(layers.SimpleRNN(200,activation='relu', dropout=0.2))
model.add(layers.Dense(3, activation='sigmoid'))

model.compile(
    optimizer=keras.optimizers.RMSprop(learning_rate=learning_Rate),
    loss=keras.losses.BinaryCrossentropy(),
    #metrics F measure
    metrics=['acc',f1_m,precision_m, recall_m]
)
model.summary()

history = model.fit(
    x_data,y_data,
    epochs=train_epochs,
    batch_size=batch_num,
    # We pass some validation for
    # monitoring validation loss and metrics
    # at the end of each epoch
    validation_data=(x_data, y_data)
)

print("Evaluate on test data")
results = model.evaluate(test_dataset)
print("test loss, test acc:", results)

Когда я выполняю его, он дает мне сообщение об ошибке:

 ValueError: Input 0 of layer sequential_35 is incompatible with the layer: expected ndim=3, found ndim=2. Full shape received: (10, 84)

Если я изменю x_data и y_data на форму (7000,10, 84) (7000,10, 3), сообщение об ошибке станет

 ValueError: logits and labels must have the same shape ((10, 3) vs (10, 10, 3))

Как я могу решить эту проблему? Я очень новичок в глубоком обучении, поэтому любые советы о том, как работать над проектом, очень ценятся.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
142
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ввод simpleRNN должен быть 3D:

x_data.resize((70000, 84, 1))

Я попробовал это, но это все еще не работает, ошибка становится «Ввод 0 слоя simple_rnn_3 несовместим со слоем: ожидаемый ndim = 3, найденный ndim = 2. Полная форма получена: (Нет, 84)», когда я добавляю слой простой РНС.

staticvoid 23.12.2020 12:43

Это не устранило ошибку для меня, я все равно получил «Ввод 0 слоя simple_rnn_3 несовместим со слоем: ожидаемый ndim = 3, найденный ndim = 2. Получена полная форма: (Нет, 84)»

staticvoid 24.12.2020 02:07

Спасибо за помощь. Я обнаружил, что для меня работает то, что я использую «x_data.resize ((700, batch_num, 84))» вместе с «model.add (layers.SimpleRNN (200, activation = 'relu', dropout = 0,2, return_sequences = Верно))" для моей модели.

staticvoid 30.12.2020 06:48

Другие вопросы по теме