Как сохранить значения переменных между вызовами функций - PullRequest
0 голосов
/ 22 января 2019

Я строю функцию для заполнения буфера, которая вызывается несколько раз. Я объявляю rep_counter для сохранения его значения после каждого прохода, но когда я вызываю его снова, он сбрасывается в 0. Я попытался объявить его как self.rep_counter внутри def __init__, попытался объявить его как global функцию , но без удачи. Как мне это сделать? Вот мой фактический код:

import gym
import cv2
import numpy as np
from collections import deque

env = gym.make('SpaceInvaders-v0')
env.reset()
action_size = env.action_space.n
state_size = env.observation_space.shape
steps =  0 
step_counter = 0          
total_reward = 0
i = 0
i_update = i
episodes = 100010
img_batch_size = 4
img_batch = []
state1, reward1, _, _ = env.step(0)
batch_shape = (1,80,80,4)
img_batch = [state1,state1,state1,state1]
exp_batch = []
rep_batch = []
rep_batch_size = 4
rep_counter = 0
memory_length = 2
memory = deque((), maxlen = memory_length)
rep_batch = deque((), maxlen = rep_batch_size)


class AI:          
    def replay(self, exp_batch, rep_counter):
        if rep_counter < rep_batch_size:
            rep_counter += 1
            rep_batch.append(exp_batch)            
        else:
            if len(memory) < memory_length:
                memory.append(rep_batch)
            else:
                memory.popleft()
                memory.append(rep_batch)
            rep_batch.popleft()
            rep_batch.append(exp_batch)
            rep_counter = 0


    def buffer_processing(img_batch):
        processed_batch = [cv2.resize(cv2.cvtColor(x,cv2.COLOR_RGB2GRAY),(80,80)) for x in img_batch]
        processed_batch = [[x/255.0]for x in processed_batch]
        processed_batch = np.asarray(processed_batch)
        processed_batch.shape = batch_shape
        return processed_batch

    a = buffer_processing(img_batch)

for i in range (episodes):
    total_reward = 0

    for steps in range (10000):
        action = env.action_space.sample()
        next_state, reward, done, _ = env.step(action)
        total_reward += reward
        state = next_state
        exp_batch = (state, action, next_state, reward, done)
        agent = AI()
        agent.replay(exp_batch, rep_counter)
        exp_batch = []
        step_counter += 1


1 Ответ

0 голосов
/ 22 января 2019

В ожидании минимального полного рабочего примера, как указано в комментариях, здесь возможны предложения.

Вы можете объявить его глобальным, а затем внутри функции ссылаться на него как global rep_counter перед его использованием.

Вы можете объявить его как переменную экземпляра внутри любого метода (лучше, если __init__) как self.rep_counter.

Вы можете объявить его как переменную класса (его значение является общим для всех экземпляров):

class AI:
    rep_counter

и назвать его как AI.rep_counter.

Если мы говоримЧто касается чистых функций, вы можете использовать метод, который вызывает статическое ключевое слово C / C ++:

def myFunction():
    ...
    myFunction.NumberOfCalls += 1

myFunction.NumberOfCalls = 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...