如何解决Keras自动编码器无法重建一维信号
我想训练一个自动编码器神经网络。
然后,为了创建数据集,我将该信号分为数千个(重叠的)段(每个段有1024个样本)。每个细分都保存到单独的.txt文件中。
我的代码正在关注
import tensorflow as tf
import tensorflow.keras as keras
import matplotlib.pyplot as plt
import glob
import numpy as np
def load_dataset(dataset_path,train_val_ratio=0.8):
filenames = glob.glob(dataset_path+"\\*.txt")
windows_amount = len(filenames)
lines = [line.rstrip('\n') for line in open(filenames[0])]
window_length = len(lines)
train_windows_amount = int(np.ceil(windows_amount*train_val_ratio))
val_windows_amount = int(np.ceil(windows_amount*(1-train_val_ratio)))
train_windows = np.zeros((train_windows_amount,window_length),dtype=np.float)
val_windows = np.zeros((val_windows_amount,dtype=np.float)
for j in range(len(filenames)):
if j%100 == 0:
print(str(j/windows_amount*100)+"%")
lines = [line.rstrip('\n') for line in open(filenames[j])]
if j < train_windows_amount:
for i in range(len(lines)):
train_windows[j,i] = float(lines[i])
else:
for i in range(len(lines)):
val_windows[j-train_windows_amount,i] = float(lines[i])
return train_windows,val_windows
train_path = ".\\dataset\\dataset_1\\train"
train_windows,val_windows = load_dataset(train_path)
train_windows = train_windows/1000000
val_windows = val_windows/1000000
treshold_path = ".\\dataset\\dataset_1\\treshold"
treshold_windows,_ = load_dataset(treshold_path)
treshold_windows = treshold_windows/1000000
model = keras.Sequential([
keras.layers.Dense(1024,activation='relu',name="encoder"),keras.layers.Dense(512,activation='relu'),keras.layers.Dense(256,name="bottleneck"),keras.layers.Dense(1024,activation='sigmoid',name="decoder")
])
model.compile(optimizer = "adam",loss='binary_crossentropy',metrics=['accuracy'])
history = model.fit(train_windows,train_windows,batch_size=128,epochs=200,verbose=1,shuffle=True,validation_data=(val_windows,val_windows))
plt.plot(history.history['loss'],label='loss')
plt.plot(history.history['accuracy'],label='train')
plt.plot(history.history['val_accuracy'],label='val')
plt.grid()
plt.legend()
plt.show()
test_loss,test_acc = model.evaluate(treshold_windows,treshold_windows,verbose=2)
print('Test loss:',test_loss)
model.save_weights('model.h5')
reconstructed = model.predict(treshold_windows)
plt.plot(treshold_windows[10])
plt.plot(reconstructed[0])
plt.plot(reconstructed[10])
plt.plot(reconstructed[20])
plt.plot(reconstructed[30])
plt.plot(reconstructed[40])
plt.grid()
plt.legend()
plt.show()
当我尝试在以前看不见的信号的一部分上使用经过训练的自动编码器时,得到以下图:
其中上信号是输入段, 黄色信号是神经网络的输出信号, 其他颜色信号是其他输入段的神经网络输出。
我希望自动编码器产生的输出与其输入类似,但是这里不是这种情况。我在做什么错了?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。