#python #tensorflow #machine-learning #time-series #forecasting
#python #тензорный поток #машинное обучение #временные ряды #прогнозирование
Вопрос:
Я пытаюсь обучить модель для одномерного прогнозирования временных рядов в Tensorflow. Сначала я создаю tf.data.Dataset
из фрейма данных, используя окно 10, где последнее значение в каждом окне является основным значением истинности, которое должно быть предсказано. Затем я перетасовываю и разбиваю набор данных на набор данных для обучения / проверки / тестирования, используя пропорцию 70% / 15% / 15% соответственно. Я пакую наборы поездов и проверок с размером пакета 32.
df = pd.read_csv('MY.csv', index_col=0, parse_dates=True)
#extract the column we are interested in
single_col = df[['Close']]
#Convert to TFDataset
WINDOW_SIZE = 10
dataset = tf.data.Dataset.from_tensor_slices((single_col_df.values))
d = dataset.window(WINDOW_SIZE, shift=1, drop_remainder=True)
d2 = d.flat_map(lambda window: window.batch(WINDOW_SIZE 1))
#create data and ground truth
d3 = d2.map(lambda window: (window[:-1], window[-1:]))
#get the total data and shuffle
len_ds = 0
for item in d2:
len_ds =1
d_shuffled = d3.shuffle(buffer_size=len_ds)
# split train/test
train_size = int(0.7 * len_ds)
val_size = int(0.15 * len_ds)
test_size = int(0.15 * len_ds)
train_dataset = d_shuffled.take(train_size)
test_dataset = d_shuffled.skip(train_size)
val_dataset = test_dataset.skip(test_size)
test_dataset = test_dataset.take(test_size)
train_dataset = train_dataset.batch(32).prefetch(2)
val_dataset = val_dataset.batch(32)
Теперь я определяю, компилирую и обучаю модель. Я предполагаю input_shape
, что первый уровень GRU должен быть [WINDOW_SIZE, 1]
, т. Е. Количество прошлых выборок, которые будут использоваться для нового прогноза, и $ 1 $, потому что это одномерная модель.
# DEFINE THE MODEL ARCHITECTURE
MODEL_ARCH = [
tf.keras.layers.GRU(32, return_sequences=True, input_shape=[WINDOW_SIZE, 1]),
tf.keras.layers.GRU(32,),
tf.keras.layers.Dense(10, activation='tanh'),
tf.keras.layers.Dense(1, activation='tanh'),
tf.keras.layers.Lambda(lambda x: x*100)
]
# TRAIN THE MODEL
model = tf.keras.models.Sequential(MODEL_ARCH)
optimizer = tf.keras.optimizers.Adagrad(lr=1e-3)
model.compile(loss='mse', optimizer=optimizer) #accuracy is a categorical metric: don't use it
history = model.fit(train_dataset, epochs=100, validation_data=val_dataset)
Проблема возникает при оценке или прогнозировании модели: я хочу оценивать / прогнозировать отдельные значения вместо пакетов. Запуск model.evaluate(test_dataset)
возвращает ошибку, я думаю, потому, что обучение выполнялось на пакетах по 32, но test_data
не было пакетным. Для этого вместо этого я вынужден делать:
model.evaluate(test_data.batch(1), batch_size=1)
Но при каждом запуске это возвращает другой результат. Проблема, я думаю, заключается в том, что после обучения модели с заданным размером ванны я не могу использовать ее для одного прогноза. Я попытался также переопределить модель и скопировать веса, как предлагали другие сообщения, но это не помогло. Проблема может быть связана также с формой ввода, которую я установил для первого слоя, т. Е. [WINDOW_SIZE, 1]
since .
ДОПОЛНИТЕЛЬНЫЙ СОВЕТ
У кого-нибудь есть лучший способ узнать длину tf.data.Dataset
структуры вместо того, чтобы перебирать ее элементы, как я?
Комментарии:
1. «У кого-нибудь есть лучший способ узнать длину tf.data. Структура набора данных вместо перебора ее элементов, как я делал? »
tf.data.Dataset.cardinality
2.
test_dataset.cardinality().numpy()
,val_dataset.cardinality().numpy()
train_dataset.cardinality().numpy()
возвращаются-2
.3. Затем он возвращает
tf.data.experimental.UNKNOWN_CARDINALITY
значение, означающее, что tensorflow не может определить размер набора данных. Единственное решение — перебирать его.