Моя регрессия CNN предсказывает один и тот же результат для разных входов - PullRequest
0 голосов
/ 21 июня 2020

Я создавал CNN для предсказания активности некоторых молекул. Но пока я тренирую свои данные, они дают один и тот же прогноз, что бы я ни делал. Я сделал линейные слои более глубокими, я изменил скорость обучения и партии, я даже пытался обучать сеть по одной молекуле за раз, но тоже. Я убедился, что размеры совпадают между данными и прогнозом, но он всегда дает одни и те же значения (как если бы он выбирал только одно значение меток для обучения всего набора данных.)

class Net(nn.Module):
   def __init__(self):
       super().__init__()
       self.conv1 = nn.Conv2d(1, 32, 5)  # (input, features, kernel)
       # that kernel size is the best as it gives highest features
       self.conv2 = nn.Conv2d(32, 64, 5)
       self.conv3 = nn.Conv2d(64, 128, 5)
       
       x = torch.randn(267, 56).view(-1, 1, 267, 56)
       self._to_linear = None
       # generate a dummy array where our
       # /values to be flattened will be introduced inside
       self.convs(x)
       # Pooling and flattening to prepare for the linear network
       # Linear function
       
       self.fc1 = nn.Linear(self._to_linear, 5000)  # flattening
       self.fc2 = nn.Linear(5000, 1000)
       self.fc3 = nn.Linear(1000, 500)
       self.fc4 = nn.Linear(500, 256)
       self.fc5 = nn.Linear(256, 128)
       self.fc6 = nn.Linear(128, 32)
       self.fc7 = nn.Linear(32, 1)

   def convs(self, x):
       # Max pooling over 3x3
       x = F.max_pool2d(F.relu(self.conv1(x)), (2, 2))
       x = F.max_pool2d(F.relu(self.conv2(x)), (2, 2))
       x = F.max_pool2d(F.relu(self.conv3(x)), (2, 2))
       if self._to_linear is None:
           self._to_linear = x[0].shape[0]*x[0].shape[1]*x[0].shape[2]
       return x

   def forward(self, x):
       x = self.convs(x)
       x = x.view(-1, self._to_linear)
       # .view is reshape ... this flattens X before
       x = F.relu(self.fc1(x))
       x = F.relu(self.fc2(x))
       x = F.relu(self.fc3(x))
       x = F.relu(self.fc4(x))
       x = F.relu(self.fc5(x))
       x = F.relu(self.fc6(x))
       x = self.fc7(x)
       # bc this is our output layer. No activation here.
       return x 


net = Net()
print(net)

# Optimizer and Loss Function
optimizer = optim.Adam(net.parameters(), lr=0.01)
loss_function = nn.MSELoss()

epochs = 10
BATCH_SIZE = 100
if torch.cuda.is_available(): #gpu adapted
   net1.cuda()

for epoch in range(epochs):# Converting inputs and labels to Variable (first 50)
   for i in tqdm(range(0, len(x_trial), BATCH_SIZE)):
       if torch.cuda.is_available():
           inputs = Variable(x_inp.cuda())
           labels = Variable(y_inp.cuda())
       else:
           inputs = Variable(x_trial[i:i+BATCH_SIZE])
           labels = Variable(y_trial[i:i+BATCH_SIZE])

       # Clear gradient buffers
       optimizer.zero_grad()

       # get output from the model, given the inputs
       outputs = net(inputs)

       # get loss for the predicted output
       loss = loss_function(outputs, labels)
       print(loss)
       # get gradients w.r.t to parameters
       loss.backward()

       # update parameters
       optimizer.step()

   print('epoch {}, loss {}'.format(epoch, loss.item()))

#The prediction is something like that :-
tensor([[6.1313],
       [6.1313],
       [6.1313],
       ...,
       [6.1313],
       [6.1313],
       [6.1313]])

кредиты в обучении и модели на https://pythonprogramming.net/convnet-model-deep-learning-neural-network-pytorch/

Кто-нибудь может помочь?

...