它可能看起来像很多代码,但是大多数代码是注释或格式化以使其更可读。
给定:
如果我定义了感兴趣的变量,则"序列",如下:
# define input sequence
np.random.seed(988)
#make numbers 1 to 100
sequence = np.arange(0,10, dtype=np.float16)
#shuffle the numbers
sequence = sequence[np.random.permutation(len(sequence))]
#augment the sequence with itself
sequence = np.tile(sequence,[15]).flatten().transpose()
#scale for Relu
sequence = (sequence - sequence.min()) / (sequence.max()-sequence.min())
sequence
# reshape input into [samples, timesteps, features]
n_in = len(sequence)
sequence = sequence.reshape((1, n_in, 1))
问题:
如何在KERAS中的自动编码器中使用Conv1D来估计该序列具有合理的准确性?
如果conv1d不适合此问题,您能告诉我,对于编码器而言,可能更合适的层类型?
更多信息:
有关数据的要点:
- 这是10个不同值的重复序列
- 单个滞后10个步骤应完美预测序列
- 10个元素的字典应给出一个"预测下一个"
我曾尝试过其他层编码器和解码器部分(LSTM,密集,多层密集(来预测,并且它们一直在MSE约为0.0833的"墙"上击中一个均匀分布的方差范围,这是一个均匀分布的方差0和1。对我来说,这个简单问题的好自动编码器应该能够至少获得99.9%的准确性,因此" MSE"基本低于1%。
我无法让Conv1D工作,因为我弄乱了输入。似乎没有很好的例子说明如何使它起作用,而且我对这种整体架构来说是足够的,这对我来说并不明显。
链接:
- https://ramhiser.com/post/2018-05-14-autoencoders-with-keras/
- https://machinelearningmastery.com/lstm-autoencoders/
通过使用您的方法创建1000个示例的数据集,我能够使用Conv1D获得一个很好的自动编码器模型:
LEN_SEQ = 10
x = Input(shape=(n_in, 1), name="input")
h = Conv1D(filters=50, kernel_size=LEN_SEQ, activation="relu", padding='same', name='Conv1')(x)
h = MaxPooling1D(pool_size=2, name='Maxpool1')(h)
h = Conv1D(filters=150, kernel_size=LEN_SEQ, activation="relu", padding='same', name='Conv2')(h)
h = MaxPooling1D(pool_size=2, name="Maxpool2")(h)
y = Conv1D(filters=150, kernel_size=LEN_SEQ, activation="relu", padding='same', name='conv-decode1')(h)
y = UpSampling1D(size=2, name='upsampling1')(y)
y = Conv1D(filters=50, kernel_size=LEN_SEQ, activation="relu", padding='same', name='conv-decode2')(y)
y = UpSampling1D(size=2, name='upsampling2')(y)
y = Conv1D(filters=1, kernel_size=LEN_SEQ, activation="relu", padding='same', name='conv-decode3')(y)
AutoEncoder = Model(inputs=x, outputs=y, name='AutoEncoder')
AutoEncoder.compile(optimizer='adadelta', loss='mse')
AutoEncoder.fit(sequence, sequence, batch_size=32, epochs=50)
最后一个时期输出:
Epoch 50/50
1000/1000 [==============================] - 4s 4ms/step - loss: 0.0104
测试新数据:
array([[[0.5557],
[0.8887],
[0.778 ],
[0. ],
[0.4443],
[1. ],
[0.3333],
[0.2222],
[0.1111],
[0.6665],
[...]
预测:
array([[[0.56822747],
[0.8906583 ],
[0.89267206],
[0. ],
[0.5023574 ],
[1.0665314 ],
[0.37099048],
[0.28558862],
[0.05782872],
[0.6886021 ],
[...]
一些四舍五入的问题,但是很近!
您要寻找的是吗?