簡體   English   中英

深度學習(神經網絡)挑戰數據

[英]Deep Learning (Neural Network) Challenge piece of data

我有一個困難的兩個數據集,我正在嘗試使用神經網絡來單獨擬合每個數據。 請找到數據集的鏈接。它是 seq2seq。 Data#1 有 56 個樣本,每個樣本有 3 個維度,Data#2 有 56 個樣本,每個樣本有 32 個維度。 所以,它就像多對多或 seq2seq。 https://drive.google.com/open?id=16VGoqKP1zjmlxK2u6RpVtkYgqWnlBwnl數據#1。 輸入:X1 輸出:Y1 這只是多對多擬合問題。 每個輸入的長度為 32,每個輸出的長度為 32

數據#2 輸入:X2 輸出:Y2 這只是多對多擬合問題。 每個輸入的長度為 3,每個輸出的長度為 3。

我嘗試了許多神經網絡(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 架構可供使用。 如果你能測試它,會更好。

謝謝

首先,你的數據整形是錯誤的。 注意:我剛剛注意到,您將 X1、Y1 誤認為 X2、Y2。

打印(X1.shape) -> (56,3) 打印(Y1.shape) -> (56,3)

您是否試圖將它們重塑為尺寸 (-1,30,1) 或 (-1,3,1)。 序列中沒有 32。 X1 和 Y1 都具有相同的維度 (56,3),因此這是一個 seq2seq 問題。 但是,您正在使用 1 個單位的 FC 層,就像以回歸方式一樣,這會給您帶來錯誤,因為您的輸出具有更多維度。

此外,還有其他錯誤,如 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 進行激活。 添加更多 dropout 和 recurrent_dropout。 但是,不要在最后一層之后使用 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()

損失圖

案例#2,您只有一個具有 56 個時間維度和 3 個過濾器的樣本。 這根本不是 LSTM 的情況。 您需要提供有關輸入數據格式的更多詳細信息。

案例#3,你有更多的數據和代碼,你沒有在這里添加。 請添加這些片段,以便我們提供幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM