【问题标题】:Autoencoder with different scale in different dimensions?不同维度的不同尺度的自动编码器?
【发布时间】:2023-07-24 21:12:01
【问题描述】:

Q1,我正在尝试实现自动编码器,我有这样的数据:

  1. 800 300 1 100000 -0.1
  2. 789 400 1.6 100500 -0.4
  3. 804 360 1.2 100420 -0.2

  4. ....

我应该如何规范化这些数据以便能够进行训练?

Q2,因为我不知道怎么做归一化,所以我跳过它,只是将原始数据应用到自动编码器进行训练,但是经过几次迭代后梯度变成了Nan,这里是代码。

BATCH_SIZE=1
BETA=3
INPUT=89
HIDDEN=64 
EPOCHS=1
LR=0.01
RHO=0.1
raw_data=Loader('test.csv')
print(np.shape(raw_data))
raw_data=torch.Tensor(raw_data)
train_dataset=Data.TensorDataset(data_tensor=raw_data,target_tensor=raw_data)
train_loader=Data.DataLoader(dataset=train_dataset,batch_size=BATCH_SIZE,shuffle=True)

model=SparseAutoEncoder(INPUT,HIDDEN)
optimizer=optim.Adam(model.parameters(),lr=LR)
loss_func=nn.MSELoss()


for epoch in range(EPOCHS):
    for b_index,(x,_) in enumerate(train_loader):

        x=x.view(-1,INPUT)

        x=Variable(x)

        encoded,decoded=model(x)

        loss=loss_func(decoded,x)

        optimizer.zero_grad()
        loss.backward()

        optimizer.step()

    print("Epoch: [%3d], Loss: %.4f" %(epoch + 1, loss.data))

raw_data 的形状为 (2700,89) ,每行包含 89 个维度,并且具有不同的值比例(如 Q1 所述)。

【问题讨论】:

    标签: gradient nan autoencoder


    【解决方案1】:

    获取数据在每个维度上的均值和标准差(并保留这些值),并将比例应用于您的数据。

    当您有新数据时,可以重复使用这些数据来扩展新数据。

    由于数据中尺度的变化如此之大,您将得到非常糟糕的拟合(基本上,尺度越大,拟合越好,越小,越差)。

    【讨论】: