Deep Learning (Нейронная сеть) Задача часть данных - PullRequest
0 голосов
/ 24 марта 2020

У меня два сложных набора данных, я пытаюсь использовать нейронную сеть, чтобы уместить все данные в отдельности. Пожалуйста, найдите ссылку на наборы данных. Это seq2seq. Данные № 1 имеют 56 выборок, каждая с 3dims, а Данные № 2 имеют 56 выборок, каждая с 32 dim Итак, это как многие для многих или seq2seq. https://drive.google.com/open?id=16VGoqKP1zjmlxK2u6RpVtkYgqWnlBwnl Данные № 1. Вход: X1 Выход: Y1 Это просто подходящая проблема для многих. каждый вход имеет длину 32, и каждый выход имеет длину 32

Данные # 2 Вход: X2 Выход: Y2 Это просто для многих проблема подбора. каждый вход имеет длину 3, а каждый выход имеет длину 3.

Я пробовал множество NN (DNN, LSTM, Conv1d), чтобы соответствовать любому из этих наборов данных, но подгонка всегда плохая. Ниже приведена одна из сетей, которые я пробовал (LSTM)

import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt

# load
X1 = np.load('X1.npy')
Y1 = np.load('Y1.npy')
X2 = np.load('X2.npy')
Y2 = np.load('Y2.npy')

# Reshape data
X1 = X1.reshape(-1,3,1)
Y1 = Y1.reshape(-1,3,1)
X2 = X1.reshape(-1,32,1)
Y2 = Y1.reshape(-1,32,1)

# LSTM
model = tf.keras.models.Sequential()
# layre #1
model.add(tf.keras.layers.LSTM(units=50, return_sequences=True, input_shape=(X.shape[1],1)))
model.add(tf.keras.layers.Dropout(0.12))
#layer #2
model.add(tf.keras.layers.LSTM(units=50, return_sequences=True))
model.add(tf.keras.layers.Dropout(0.12))
# layer #3
model.add(tf.keras.layers.Dense(units=1))

model.compile(optimizer='adam', loss='mse')

model.fit(X1,Y1, epochs=150, batch_size=20, verbose=1)

pred = model.predict(X)

plt.plot(Y[30,:,0], 'r')
plt.plot(pred[30,:,0], 'b')

Я также пробовал нормализацию, но настройка по-прежнему не годится. Может кто-нибудь предложить, пожалуйста, почему подгонка не является хорошей, и есть ли лучшая архитектура NN для использования. Если бы вы могли проверить это, будет лучше.

Спасибо

1 Ответ

1 голос
/ 24 марта 2020

Прежде всего, ваше изменение данных неверно. NB. Я только что заметил, что вы принимаете X1, Y1 за X2, Y2.

print (X1.shape) -> (56,3) print (Y1.shape) -> (56, 3)

Вы пытаетесь изменить их размерность (-1,30,1) или (-1,3,1). Там нет 32 в последовательностях. X1 и Y1 имеют одинаковое измерение (56,3), так что это проблема seq2seq. Но вы используете слой 1 * F C, как в режиме регрессии, который даст вам ошибку, так как ваш вывод имеет больше измерений.

Кроме того, есть другие ошибки, такие как X не был определен, и все же вы использовал это. К сожалению, ваш код полностью поврежден.

Случай № 1, я предполагаю, что данные имеют 56 выборок, а каждая выборка имеет 3 значения (временное измерение).

Для начала я добавил минимальную кодовую базу.

import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt

# load
X1 = np.load('X1.npy')
Y1 = np.load('Y1.npy')
X2 = np.load('X2.npy')
Y2 = np.load('Y2.npy')

print(X1.shape)
print(Y1.shape)
# Reshape data
X = X1.reshape(-1,3,1)
Y = Y1.reshape(-1,3)

# LSTM
model = tf.keras.models.Sequential()
# layre #1
model.add(tf.keras.layers.LSTM(units=3, return_sequences=True, input_shape=(3,1), activation = 'relu'))
model.add(tf.keras.layers.Dropout(0.4))
#layer #2
model.add(tf.keras.layers.LSTM(units=3, return_sequences=False))
model.add(tf.keras.layers.Dropout(0.12))
# layer #3

model.summary()
Model: "sequential_6"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
lstm_9 (LSTM)                (None, 3, 3)              60        
_________________________________________________________________
dropout_8 (Dropout)          (None, 3, 3)              0         
_________________________________________________________________
lstm_10 (LSTM)               (None, 3)                 84        
_________________________________________________________________
dropout_9 (Dropout)          (None, 3)                 0         
=================================================================
Total params: 144
Trainable params: 144
Non-trainable params: 0
__________________________
model.compile(optimizer='adam', loss='mse')

model.fit(X,Y, epochs=2, batch_size=20, verbose=1)

pred = model.predict(X)

Для X2, Y2:

X = X1.reshape(-1,32,1)
Y = Y1.reshape(-1,32)

# LSTM
model = tf.keras.models.Sequential()
# layre #1
model.add(tf.keras.layers.LSTM(units=32, return_sequences=True, input_shape=(3,1), activation = 'relu'))
model.add(tf.keras.layers.Dropout(0.4))
#layer #2
model.add(tf.keras.layers.LSTM(units=32, return_sequences=False))
model.add(tf.keras.layers.Dropout(0.12))

model.compile(optimizer='adam', loss='mse')

model.fit(X,Y, epochs=2, batch_size=20, verbose=1)

pred = model.predict(X)

Некоторые идеи улучшить производительность: используйте нормализацию min-max, в последнем слое используйте sigmoid для активации. Добавьте еще отсев и recurrent_dropout. Но не используйте выпадение после последнего слоя, это портит ваши прогнозы.

Вот обновленный код:

X = X1.reshape(-1,3,1)
Y = Y1.reshape(-1,3)

X = (X-np.min(X))/(np.max(X) - np.min(X))
Y = (Y-np.min(Y))/(np.max(Y) - np.min(Y))

# LSTM
model = tf.keras.models.Sequential()
# layre #1
model.add(tf.keras.layers.LSTM(units=8, return_sequences=True, input_shape=(3,1), activation = 'relu', recurrent_dropout = 0.2))
model.add(tf.keras.layers.Dropout(0.4))
model.add(tf.keras.layers.LSTM(units=8, return_sequences=True, input_shape=(3,1), activation = 'relu', recurrent_dropout = 0.2))
model.add(tf.keras.layers.Dropout(0.4))
#layer #2
model.add(tf.keras.layers.LSTM(units=3, return_sequences=False, activation = 'sigmoid'))

model.compile(optimizer='adam', loss='mse')

hist = model.fit(X,Y, epochs=50, batch_size=20, verbose=1)

import matplotlib.pyplot as plt

plt.plot(hist.history['loss'])
plt.show()

Loss plot

Случай № 2, у вас есть только одна выборка с 56 временными измерениями и 3 фильтрами. Это совсем не случай LSTM. Вам необходимо предоставить более подробную информацию о вашем формате входных данных.

Случай № 3, у вас есть больше данных и кода, которые вы не добавили здесь. Пожалуйста, добавьте эти фрагменты, чтобы мы могли помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...