【发布时间】:2021-01-19 18:11:49
【问题描述】:
我有一些 data 形状为 10000 x 1440 x 8,其中 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)
但是,这感觉很愚蠢,因为我必须能够将 3D data 传递给自动编码器并检索我想要的内容。但是,如果我尝试将输入的形状修改为 input = Input(shape=(y.shape[1],y.shape[2]))
我收到一个错误
ValueError: 维度必须相等,但对于 '{{node 来说是 1440 和 8 mean_squared_error/SquaredDifference}} = SquaredDifference[T=DT_FLOAT](model_778/dense_1558/Relu, IteratorGetNext:1)' 输入形状:[?,1440,1440], [?,1440,8]。
关于如何获得正确形状的任何指示?
【问题讨论】:
-
发布代码时,请确保您使用的所有变量都已定义。该代码没有定义
regularization等。 -
也许 RNN 更适合顺序数据...(在这种情况下它会自动接受正确的数据形状)
-
@Ananda 修复了函数,所以一切都被定义了
-
@user202729 听起来很有趣,你有更多信息吗
标签: python tensorflow machine-learning keras autoencoder