Я создавал 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/
Кто-нибудь может помочь?