Я смоделировал игру на питоне.Когда игра вызывается, она выполняет полный цикл со случайным игроком, игроком дерева решений и одним игроком RL.Когда обучающийся игрок должен принять решение, игра вызывает функцию run_network (), которая возвращает действие.В конце полной игры запускается update_reward ().
У меня задержка награды, и между наградами может быть любое количество состояний и действий.Только положительные награды обновляются в списке состояний и действий pos_rewards и никогда не удаляются.
В конце каждой игры я получаю распечатку о том, кто выиграл. Игрок RL еще ничего не выигрывает, хотя каждая игра занимает минуту и становится все длиннее.
from keras.models import model_from_json
import numpy as np
from keras.models import Sequential
from keras.layers import Dense, Dropout
import Game
def update_reward(pos_rewards):
vec = np.asarray(pos_rewards)
x = vec[:, 3:-1]
y = vec[:, -1]
y_cat = np.zeros((len(y), 7))
for i in range(len(y)):
if y[i] == 0:
y_cat[i] = [1, 0, 0, 0, 0, 0, 0]
elif y[i] == 1:
y_cat[i] = [0, 1, 0, 0, 0, 0, 0]
elif y[i] == 2:
y_cat[i] = [0, 0, 1, 0, 0, 0, 0]
elif y[i] == 3:
y_cat[i] = [0, 0, 0, 1, 0, 0, 0]
elif y[i] == 4:
y_cat[i] = [0, 0, 0, 0, 1, 0, 0]
elif y[i] == 5:
y_cat[i] = [0, 0, 0, 0, 0, 1, 0]
elif y[i] == 6:
y_cat[i] = [0, 0, 0, 0, 0, 0, 1]
model.fit(x, y_cat, batch_size=5000, epochs=1, verbose=0)
model.save_weights(model_file)
with open(arch_file, "w") as json_file:
json_file.write(model.to_json())
def run_network(state):
x = np.array(state[3:])
x = x.reshape(1, 176)
p = model.predict(x)
action = p.argmax(axis=0)
return action
arch_file = 'D:\\model\\rl_arch.json'
model_file = 'D:\\model\\rl_model.h5'
start_new = 0
if start_new == 1:
model = Sequential()
model.add(Dense(units=500, activation='relu', input_dim=176))
...
model.add(Dense(units=25, activation='relu'))
model.add(Dropout(0.3))
model.add(Dense(7, activation='softmax'))
else:
with open(f_arch, 'r') as json_file:
model = model_from_json(json_file.read())
model.load_weights(f_model)
model.compile(loss='categorical_crossentropy', optimizer='adam')
Game.tournament(10000)
Вопросы:
Когда я сохраню созданные веса, а затем решу снова выполнить весь процесс, мои веса полностью переопределятся или каждый прогон улучшит модель?
Существуют ли какие-либо статистические методы, которые я могу применить для повышения производительности модели без полного переписывания моего кода?