pytorch Aufbau neuronaler Netze automatisch ändern und tranieren lassen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Gandalf
User
Beiträge: 1
Registriert: Donnerstag 5. Dezember 2019, 15:58

Hallo,

ich wollte gern bei einem neuronalen Netz automatisch die Anzahl der Layer und auch die Anzahl der Neuronen ändern, um zu überprüfen, mit welcher Konfiguration es am besten lernt (reinforcement learning). Sprich erster Durchlauf 2 layer, 100 Neuronen, damit trainieren lassen und Ergebnisse speichern, dann 3 layer 100 Neuronen, dann 2 layer 101 Neuronen usw.

Mein Problem ist allerdings, dass ich nicht weiß, wie ich die Gewichte des Netzes zu Beginn jeder neuen Trainingseinheit wieder auf Anfangswerte gesetzt bekomme. Momentan trainiert das nächste Netz immer mit den Gewichten des vorherigen weiter (glaube ich jedenfalls).

Ich habe schon versucht die initialen Gewichte zu speichern und dann vor jedem neuem Training wieder aufzurufen, aber das funktioniert aufgrund der geänderten Netzstruktur leider nicht.
Außerdem habe ich schon versucht "alles wieder leer zu bekommen" zB mit diesen Befehlen:
torch.cuda.empty_cache()
policy.zero_grad()
del policy.loss_history[:]
del policy.reward_history[:]
del policy.episode_rewards[:]
del policy.episode_actions

Aber auch das hat nicht funktioniert. Hoffentlich versteht man, was ich meine :lol: Hat jemand eine Idee für mich?

Hier ist noch der relevante Teil des Codes:

for layerquantity in range(2, 4):

for i in range(num_hidden_try):
num_hidden_in = 128 + i

class Policy(nn.Module):
def __init__(self):
super(Policy, self).__init__()
state_space = env.observation_space.shape[0]
action_space = env.action_space.n
num_hidden = 128

self.lin1 = nn.Linear(state_space, num_hidden_in, bias=False)
if layerquantity == 2:
self.lin2 = nn.Linear(num_hidden_in, action_space, bias=False)
print('layers = ',layerquantity)
elif layerquantity == 3:
self.lin2 = nn.Linear(num_hidden_in, num_hidden, bias=False)
self.lin3 = nn.Linear(num_hidden, action_space, bias=False)
print('layers = ',layerquantity)

# Overall reward and loss history
self.reward_history = []
self.loss_history = []
self.reset()

def reset(self):
# Episode policy and rewards
self.episode_actions = torch.Tensor([])
self.episode_rewards = []


def forward(self,x):
if layerquantity == 2:
x = F.relu(F.dropout(self.lin1(x),p=0.5))
x = F.softmax(self.lin2(x), dim=-1)
return x

elif layerquantity == 3:
x = F.relu(F.dropout(self.lin1(x),p=0.5))
x = F.relu(F.dropout(self.lin2(x),p=0.5))
x = F.softmax(self.lin3(x), dim=-1)
return x

# Open textfile to save training progress
file = open(f'Cartpole_number_neurons_test/results/{datetimestr}/result_layer{layerquantity}_neurons{num_hidden_in}.txt', 'w')
file.write(f'Current run: {layerquantity} layers and {num_hidden_in} neurons in the first hiddenlayer \n \nDesired reward is: {env.spec.reward_threshold} \n \n')

policy = Policy()
optimizer = optim.Adam(policy.parameters(), lr=learning_rate)
train(episodes)
file.close()
Antworten