【问题标题】:Train autoencoder without looping在不循环的情况下训练自动编码器
【发布时间】: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


【解决方案1】:

像这样简单地重塑您的数据并调用该函数。

data = data.reshape(data.shape[0]*data.shape[1], -1)
(w1, b1, w2, b2) = AE(data)
print(w2.shape)

NN 的第一层是 Dense 层。您只能将二维数据传递给它。一维是批量大小,另一维是特征向量。当您以您使用它的方式使用数据时,您正在独立考虑每个数据点。这意味着您可以将前两个轴连接在一起,然后将其传递给 NN。但是,请注意,您仍然需要修改代码,以便您不会一次将整个数据集传递给 NN。您需要将数据分成批次并在传递之前循环遍历这些数据。老实说,这和你现在所做的一样。所以你的循环并不像你想象的那么糟糕。

但是,还请注意,您有一个时间序列数据,并且将每个数据点视为一个独立点并没有真正的意义。你需要一个 LSTM 层或其他东西来学习时间序列编码。

【讨论】:

    猜你喜欢
    • 2020-07-30
    • 2020-05-19
    • 2017-09-03
    • 1970-01-01
    • 2021-01-29
    • 2021-05-10
    • 2021-04-03
    • 2019-12-24
    • 2021-09-02
    相关资源
    最近更新 更多