我有两个困难的数据集,我试图使用神经网络来单独拟合每个数据。请找到数据集的链接。它是seq2seq。数据#1具有56个样本,每个样本具有3个维度,而数据#2具有56个样本,每个样本具有32个维度。因此,就像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架构可供使用。如果可以测试,那就更好了。
谢谢
答案 0 :(得分:1)
首先,您的数据重塑是错误的。 N.B .:我刚刚注意到,您将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单位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)
一些改善性能的想法:使用最小-最大规范化,在最后一层中使用Sigmoid进行激活。添加更多辍学和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,您有更多的数据和代码,这里没有添加。请添加这些代码段,以便我们提供帮助。