Я строю функцию для заполнения буфера, которая вызывается несколько раз. Я объявляю 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