Форма ввода Keras RNN - PullRequest
       0

Форма ввода Keras RNN

0 голосов
/ 26 февраля 2020

Я работаю с данными временного ряда, которые имеют форму 2000x1001 , где 2000 - количество случаев, 1000 строк представляют данные во временной области, смещения в направлении X в течение 1 se c period, означающий, что временной шаг равен 0.001. Последний столбец представляет скорость, выходное значение, которое мне нужно предсказать на основе смещений в течение 1 сек c. Как должны быть Входные данные для RNN в Керас ? Я прошел некоторые уроки, но все же я думаю о Input Shape в RNN. Заранее спасибо

#load data training data
dataset=loadtxt("Data.csv", delimiter=",")
x = dataset[:,:1000]
y = dataset[:,1000]


#Create train and test dataset with an 80:20 split
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2) 

#input scaling
scaler = StandardScaler()
x_train_s =scaler.fit_transform(x_train)
x_test_s = scaler.transform(x_test)

num_samples = x_train_s.shape[0] ## Number of samples
num_vals    = x_train_s.shape[1] # Number of elements in each sample

x_train_s = np.reshape(x_train_s, (num_samples, num_vals, 1))

#create model
model = Sequential()
model.add(LSTM(100, input_shape=(num_vals, 1)))
model.add(Dense(1, activation='relu'))
model.compile(loss='mae', optimizer='adam',metrics = ['mape'])
model.summary()

#training
history = model.fit(x_train_s, y_train,epochs=10, verbose = 1, batch_size =64)

Ответы [ 2 ]

1 голос
/ 26 февраля 2020

посмотрите на этот код: он пытается предсказать следующие 4 значения на основе предыдущих 6 значений. следуйте комментариям и посмотрите, как очень простым вводом манипулируют, чтобы использовать его в качестве ввода в rnn / lstm

, следуйте комментариям в коде

from __future__ import absolute_import, division, print_function, unicode_literals
import tensorflow as tf
from tensorflow.keras import Model
import numpy as np
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.layers import RNN, LSTM

"""
creating a toy dataset
lets use this below ```input_sequence``` as the sequence to make data points.
as per the question, we will use 6 points to predict next 4 points
"""
input_sequence = [1,2,3,4,5,6,7,8,9,10,1,2,3,4,5,6,7,8,9,10,1,2,3,4,5,6,7,8,9,10]

X_train = []
y_train = []


**#first 6 points will be our input data points and next 4 points will be data label.
#so on we will shift by 1 and make such data points and label pairs**


for i in range(len(input_sequence)-9):
    X_train.append(input_sequence[i:i+6])
    y_train.append(input_sequence[i+6:i+10])

X_train = np.array(X_train, dtype=np.float32)
y_train = np.array(y_train, dtype=np.int32)))


**#X_test for the predictions (contains 6 points)**


X_test = np.array([[8,9,10,1,2,3]],dtype=np.float32)
print(X_train.shape)
print(y_train.shape)
print(X_test.shape)


**#we will be using basic LSTM, which accepts input in ```[num_inputs, time_steps, data_points], therefore reshaping as per that```** 
# so here:
# 1. num_inputs = how many sequence of 6 points you want to use i.e. rows (we use X_train.shape[0] )

# 2. time_steps = batches you can considered i.e. if you want to use 1 or 2 or 3 rows

# 3. data_points = number of points (for ex. in our case its 6 points we are using)

X_train = np.reshape(X_train, (X_train.shape[0], 1, X_train.shape[1]))
X_test = np.reshape(X_test, (X_test.shape[0], 1, X_test.shape[1]))
print(X_train.shape)
print(y_train.shape)
print(X_test.shape)

x_points = X_train.shape[-1]
print("one input contains {} points".format(x_points))

model = Sequential()
model.add(LSTM(4, input_shape=(1, x_points)))
model.add(Dense(4))
model.compile(loss='mean_squared_error', optimizer='adam')
model.summary()

model.fit(X_train, y_train, epochs=500, batch_size=5, verbose=2)
output = list(map(np.ceil, model.predict(X_test)))
print(output)

надеюсь, это поможет. спросите любые сомнения, пожалуйста.

0 голосов
/ 26 февраля 2020

Как объяснено в do c, Keras ожидает следующую форму для RNN:

(batch_size, timesteps, input_dim)
  • batch_size - количество образцов, которые вы подавали до backprop
  • timesteps - количество временных шагов для каждого образца
  • input_dim - количество функций для каждого временного шага

РЕДАКТИРОВАТЬ подробнее:

В вашем случае вы должны go для

batch_input_shape = (batch_size, timesteps, 1)

с batch_size и timesteps, выбранными как вы, sh.

Как насчет временные шаги?

Допустим, вы берете один из 2000 сэмплов, и предположим, что ваш сэмпл содержит 10 элементов вместо 1000, например:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Тогда, если мы выбрали timesteps=3, тогда вы получите партию длиной 8:

[[[0], [1], [2]],
 [[1], [2], [3]],
 [[2], [3], [4]],
 [[3], [4], [5]],
 [[4], [5], [6]],
 [[5], [6], [7]],
 [[6], [7], [8]],
 [[7], [8], [9]]]
...