基于encoder-decoder和DCGAN的轨迹压缩研究
内容介绍
首先,本文的尝试功效为:掉败。
本文仅实现了措施编码和功效可视化,但是没实现的本文的方针。
理论可行的一个课题研究,但是颠末初阶测验考试,似乎不成行,我也不知道哪些处所错了,或者需要插手那些数据措置惩罚惩罚法式,或者措施自己就那里逻辑错了。
本文给出了完整的措施和尝试思路,用来交流。
由于我对经典的算法好比小波分析,稀疏编码等常识不太了解(本文并不是这个范围的学者,只是一个菜鸟学生)。所以有可能下面的讨论想法可能都是错的,所以但愿大家轻喷。
更多的目的只是但愿大家交流,,原来想写一篇小论文的,但是颠末一天测验考试,似乎不太行(觉得存在很多不知道怎么措置惩罚惩罚的问题)。索性写出来交流(虽然不知道有没有人看)。
问题介绍
AIS数据(可以理解为船舶传感器数据)存在很多的冗余情况,AIS信息由于具有重要的研究价值,不能等闲的删除。但是存储一直累计的海量的AIS数据带来了一些存储上的困难。但是目前没有一种可以一种有效的压缩要领(可以实现压缩和还原)。
因此提出课题:能不能向图片压缩一样,向小波分析一样,找到一个完备的字典,能够将AIS数据实现压缩和还原。
在目前的研究中,较为热门的就是用自编码神经网络,设置合适地约束条件,在不竭的迭代学习中,来完成字典的寻找。
本文思路
网络模型
构建一个编码器encoder,一个解码器decoder,和一个判别器discriminator。
此中encoder用来实现压缩编码,decoder实现解码,discriminator用来判断解码出来的轨迹是否和原轨迹一样。
代码如下:
def make_encoder():
model = tf.keras.Sequential()
model.add(tf.keras.layers.Flatten())
model.add(tf.keras.layers.Dense(200,activation='relu'))
model.add(tf.keras.layers.Dense(200,activation='tanh'))
model.add(tf.keras.layers.Dense(50,activation='relu'))
model.add(tf.keras.layers.Dense(25,activation='relu'))
model.add(tf.keras.layers.Dense(20,activation='tanh'))
model.add(tf.keras.layers.Reshape((100,2)))
return model
def make_decoder():
model = tf.keras.Sequential()
model.add(tf.keras.layers.Flatten())
model.add(tf.keras.layers.Dense(20, activation='relu'))
model.add(tf.keras.layers.Dense(25, activation='relu'))
model.add(tf.keras.layers.Dense(50, activation='relu'))
model.add(tf.keras.layers.Dense(200, activation='relu'))
model.add(tf.keras.layers.Dense(200, activation=None))
model.add(tf.keras.layers.Reshape((100,2)))
return model
def make_discriminator_model():
model= tf.keras.Sequential()
model.add(tf.keras.layers.Flatten())
model.add(tf.keras.layers.Dense(200,activation='relu'))
model.add(tf.keras.layers.Dense(100,activation='relu'))
model.add(tf.keras.layers.Dense(50,activation='relu'))
model.add(tf.keras.layers.Dense(25,activation='tanh'))
return model
价钱函数
较为重要的是构建价钱函数,基于GAN的思想,encoder和decoder可以当作一个整体的生成器,于是两个网络的loss都设置为了判别器把生成的轨迹判别为真的的交叉熵。
而discriminator的loss设置为把真实轨迹识别为真的交叉熵和把生成轨迹识别为假的交叉熵的和。根基思路仍然是两个网络在反抗训练中互相收敛。
代码如下
def discriminator_loss(real_output,fake_output):
real_loss = cross_entropy(tf.ones_like(real_output),real_output)
fake_loss = cross_entropy(tf.zeros_like(fake_output),fake_output)
total_loss = real_loss + fake_loss
return total_loss
def encode_loss(fake_output):
return cross_entropy(tf.ones_like(fake_output),fake_output)
def decode_loss(fake_output):
return cross_entropy(tf.ones_like(fake_output),fake_output)
梯度下降
encoder_optimizer=tf.keras.optimizers.Adam(1e-4)
decoder_optimizer=tf.keras.optimizers.Adam(1e-4)
discriminator_optimizer=tf.keras.optimizers.Adam(1e-4)
## 该注解将会使下面的函数被“编译”
@ tf.function
def train_step(track):
with tf.GradientTape() as encoder_tape, tf.GradientTape() as decoder_tape, tf.GradientTape() as disc_tape:
en_track = encoder(track,training = True)
de_track = decoder(en_track,training = True)
real_output = discriminator(track,training = True)
fake_output = discriminator(de_track,training =True)
en_loss = encode_loss(fake_output)
de_loss = decode_loss(fake_output)
disc_loss = discriminator_loss(real_output,fake_output)
gradients_of_encoder = encoder_tape.gradient(en_loss,encoder.trainable_variables)
gradients_of_decoder = decoder_tape.gradient(de_loss,decoder.trainable_variables)
gradients_of_disc = disc_tape.gradient(disc_loss,discriminator.trainable_variables)
encoder_optimizer.apply_gradients(zip(gradients_of_encoder,encoder.trainable_variables))
decoder_optimizer.apply_gradients(zip(gradients_of_decoder,decoder.trainable_variables))
discriminator_optimizer.apply_gradients(zip(gradients_of_disc,discriminator.trainable_variables))
return en_loss, de_loss , disc_loss
可视化
def plot_curve(var):
var = tf.squeeze(var)
x = tf.squeeze(var[:,0])
y=tf.squeeze(var[:,1])
plt.cla()
plt.scatter(x,y)
plt.xlabel('longitude')
plt.ylabel('latitude')
plt.show()
plt.pause(0.1)
完整代码如下: