Как тренировать особенности в разных масштабах в модели глубокого обучения - PullRequest
0 голосов
/ 23 октября 2019

Я новичок в глубоком обучении, и я построил очень простую модель, чтобы попытаться обучить мои данные. У меня есть две функции ввода: sex и age. sex равно 0 или 1, а age находится между 25 и 60. Вывод просто 0 означает, что у этого человека нет такой болезни, а 1 означает, что имеет такую ​​болезнь.

Однако, когда я тренирую свою модель, потери на тренировке совсем не уменьшаются. Похоже, потому что мои две функции очень разные по дальности. Так как я могу это исправить? Любые предложения будут ценны.

Мой код здесь:

class Net(nn.Module):
    def __init__(self):
        super(Net,self).__init__()

        self.fc1 = nn.Sequential(
            nn.Linear(2,50),
            nn.ReLU(),
            nn.Linear(50,2)
        )

    def forward(self,x):
        x = self.fc1(x)

        x = F.softmax(x, dim=1)
        return x

#Inputs
X = np.column_stack((sex,age))
X = torch.from_numpy(X).type(torch.FloatTensor)
y = torch.from_numpy(y).type(torch.LongTensor)


#Initialize the model        
model = Net()
#Define loss criterion
criterion = nn.CrossEntropyLoss()
#Define the optimizer
optimizer = torch.optim.Adam(model.parameters(), lr=0.01)

epochs = 1000

losses = []
for i in range(epochs):

    y_pred = model.forward(X)
    #Compute Cross entropy loss
    loss = criterion(y_pred,y)
    #Add loss to the list
    losses.append(loss.item())
    #Clear the previous gradients
    optimizer.zero_grad()
    #Compute gradients
    loss.backward()
    #Adjust weights
    optimizer.step()
    _, predicted = torch.max(y_pred.data, 1)

    if i % 50 == 0:
        print(loss.item())

И потеря поезда выглядит следующим образом

0.9273738861083984
0.6992899179458618
0.6992899179458618
0.6992899179458618
0.6992899179458618
0.6992899179458618
0.6992899179458618
0.6992899179458618
0.6992899179458618
0.6992899179458618
0.6992899179458618
0.6992899179458618
0.6992899179458618
0.6992899179458618

РЕДАКТИРОВАТЬ

СпасибоВы за ваши комментарии. Извините, я не объяснил свой вопрос четко. Это часть моей сети, и мои входные данные состоят из двух частей: первая часть - это некоторые сигнальные данные, и я использую модель CNN для обучения, и она работает хорошо;вторая часть - это то, что я упомянул выше. Моя цель - объединить две модели, чтобы улучшить мою точность. Я пробовал нормализацию и похоже, что это работает. Я хочу знать, всегда ли необходимо проводить нормализацию при предварительной обработке данных? Спасибо!

1 Ответ

0 голосов
/ 23 октября 2019

Альтернатива.

Если возраст имеет дискретные значения в диапазоне (25-60), то одним из возможных способов будет изучение вложений для этих двух атрибутов sex и age.

Например,

class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()

        self.sex_embed = nn.Embedding(2, 20)
        self.age_embed = nn.Embedding(36, 50)

        self.fc1 = nn.Sequential(
            nn.Linear(70, 35),
            nn.ReLU(),
            nn.Linear(35, 2)
        )

    def forward(self, x):
        # write the forward

В вышеприведенном примере я предполагаю, что значения возраста будут целыми числами (25, 26, ..., 60), поэтому для каждого возможного значения мы можем узнать представление вектора.

Итак, я предлагаю выучить 20d представление пола и 50d представление возраста. Вы можете изменить размеры и провести эксперименты, чтобы найти оптимальное значение.

...