我有一些形状为10000 x 1440 x 8
的data
,其中10000为天数,1440为分钟数,8为特征数。
每一天,即。每个大小为1440 x 8
的子矩阵我希望训练一个自编码器并从第二层提取权重,这样我的输出将是一个矩阵output = 10000 x 8
我可以在循环中使用
import numpy as np
from keras.layers import Input, Dense
from keras import regularizers, models, optimizers
data = np.random.random(size=(10000,1440,8))
def AE(y, epochs=100,learning_rate = 1e-4, regularization = 5e-4, epochs=3):
input = Input(shape=(y.shape[1],))
encoded = Dense(1, activation='relu',
kernel_regularizer=regularizers.l2(regularization))(input)
decoded = Dense(y.shape[1], activation='relu',
kernel_regularizer=regularizers.l2(regularization))(encoded)
autoencoder = models.Model(input, decoded)
autoencoder.compile(optimizer=optimizers.Adam(lr=learning_rate), loss='mean_squared_error')
autoencoder.fit(y, y, epochs=epochs, batch_size=10, shuffle=False)
(w1,b1,w2,b2)=autoencoder.get_weights()
return (w1,b1,w2,b2)
lst = []
for i in range(data.shape[0]):
y = data[i]
(_, _, w2, _) = AE(y)
lst.append(w2[0])
output = np.array(lst)
然而,这感觉非常愚蠢,因为我必须能够将3Ddata
传递给自动编码器并检索我想要的东西。然而,如果我尝试修改输入的形状为input = Input(shape=(y.shape[1],y.shape[2]))
我得到一个错误
ValueError:尺寸必须相等,但是对于{{节点是1440和8mean_squared_error/SquaredDifference}} =SquaredDifference [T = DT_FLOAT] (model_778/dense_1558/Relu,IteratorGetNext:1)'与输入形状:[?、1440、1440],[? 1440 8]。
关于如何得到正确的形状有什么建议吗?
只需像这样重塑您的数据并调用函数。
data = data.reshape(data.shape[0]*data.shape[1], -1)
(w1, b1, w2, b2) = AE(data)
print(w2.shape)
你的神经网络的第一层是一个稠密层。你只能向它传递二维数据。一个维度是批处理大小,另一个维度是特征向量。当您以您正在使用的方式使用数据时,您正在独立地考虑每个数据点。这意味着你可以把前两个轴连接在一起然后把它传递给神经网络。然而,请注意,您仍然需要修改代码,以便您不会立即将整个数据集传递给NN。您需要将数据分成几批,并在传递之前对这些数据进行循环。老实说,这和你现在做的是一样的。所以你的循环并不像你想的那么糟糕。
但是,还要注意,您有一个时间序列数据,并且将每个数据点视为一个独立的点实际上是没有意义的。你需要一个LSTM层或其他东西来学习时间序列编码。