Нейронная сеть не распознает базовый шаблон ввода - PullRequest
2 голосов
/ 08 июля 2019

Я построил рекуррентную нейронную сеть для прогнозирования данных временных рядов. Мне казалось, что я получаю разумные результаты, это будет начинаться с точностью 33% для трех классов, как и ожидалось, и становилось лучше, как и ожидалось. Я хотел протестировать сеть, чтобы убедиться, что она действительно работает, поэтому я создал базовый ввод / вывод следующим образом:

in1  in2  in3   out
 1    2    3     0
 5    6    7     1
 9    10   11    2
 1    2    3     0
 5    6    7     1
 9    10   11    2

Я скопировал этот шаблон через миллион строк в формате CSV. Я бы предположил, что нейронная сеть может легко идентифицировать эту модель, поскольку она всегда одинакова. Я пробовал отклонение от нормы .1, .01, .001, .0001, но оно всегда составляет около 33% (34% для .0001 лр). Я опубликую свой код ниже, может ли нейронная сеть легко определить это, что-то не так с моей настройкой?

import os
import pandas as pd
from sklearn import preprocessing
from collections import deque
import random
import numpy as np
import time
import random
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout, LSTM, CuDNNLSTM, BatchNormalization
from tensorflow.keras.models import load_model

df = pd.DataFrame()
df = pd.read_csv('/home/drew/Desktop/numbers.csv')

times = sorted(df.index.values)
last_5pct = times[-int(0.1*len(times))]
validation_df = df[(df.index >= last_5pct)]
main_df = df[(df.index < last_5pct)]

epochs = 10
batch_size = 64

train_x = main_df[['in1','in2','in3']]
validation_x = validation_df[['in1','in2','in3']]
train_y = main_df[['out']]
validation_y = validation_df[['out']]

train_x = train_x.values
validation_x = validation_x.values
train_x = train_x.reshape(train_x.shape[0],1,3)
validation_x = validation_x.reshape(validation_x.shape[0],1,3)

model = Sequential()

model.add(LSTM(128, input_shape=(train_x.shape[1:]), return_sequences=True))
model.add(Dropout(0.2))
model.add(BatchNormalization())

model.add(LSTM(128, input_shape=(train_x.shape[1:]), return_sequences=True))
model.add(Dropout(0.2))
model.add(BatchNormalization())

model.add(Dense(32, activation="relu"))
model.add(Dropout(0.2))

model.add(Dense(3, activation="softmax"))

opt = tf.keras.optimizers.Adam(lr=0.0001, decay=1e-6)

model.compile(loss='sparse_categorical_crossentropy',
             optimizer=opt,
             metrics=['accuracy'])

model.fit(train_x, train_y,
          batch_size=batch_size, 
          epochs=epochs,
          validation_data=(validation_x, validation_y))

результат:

Train on 943718 samples, validate on 104857 samples
Epoch 1/10
943718/943718 [===] - 125s 132us/sample - loss: 0.0040 - acc: 0.3436 - val_loss: 2.3842e-07 - val_acc: 0.3439
Epoch 2/10
943718/943718 [===] - 111s 118us/sample - loss: 2.1557e-06 - acc: 0.3437 - val_loss: 2.3842e-07 - val_acc: 0.3435
...
Train on 943718 samples, validate on 104857 samples
Epoch 1/10
943718/943718 [==============================] - 125s 132us/sample - loss: 0.0040 - acc: 0.3436 - val_loss: 2.3842e-07 - val_acc: 0.3439
Epoch 2/10
943718/943718 [==============================] - 111s 118us/sample - loss: 2.1557e-06 - acc: 0.3437 - val_loss: 2.3842e-07 - val_acc: 0.3435
Epoch 6/10
719104/943718 [=====================>........] - ETA: 25s - loss: 2.4936e-07 - acc: 0.3436

1 Ответ

0 голосов
/ 13 июля 2019

Похоже, что вы не прогнозируете результат временного ряда, поэтому нет необходимости возвращать последовательность после второго LSTM слоя.

Если вы измените второй LSTM на:

model.add(LSTM(128, input_shape=(train_x.shape[1:])))

Тогда вы должны получить высокую точность.

...