В одном из моих проектов я обучаю нейронные сети играть в игру.Чтобы увидеть их процесс, я делаю график с pyplot / matplotlib, показывая их лучшие и средние показатели пригодности.Большая часть этого работает, но по какой-то причине он не будет отображать некоторые данные из своего массива данных.Как я могу получить его для построения всех данных?
График даже не появляется в первый раз, когда запускается оператор print, хотя в массиве показателей есть один элемент.За вторым оператором печати следует график, показывающий только первый элемент массива, а за третьим оператором - график, показывающий первый и второй и т. Д.
Ниже приведен мой код, для простоты я удалилСетевая часть и просто используйте случайные целые числа для моделирования fitnessscores:
import numpy as np
import json
import matplotlib.pyplot as plt
import random
def graphFitnessScores(fileName):
with open(fileName, "r") as file:
alldata = [json.loads(line) for line in file.readlines()]
plt.pause(0.001)
plt.clf()
bestFitnesPerGen = [alldata[i]["bestFitnesses"][0] for i in range(len(alldata))]
print("generation %d, amountOfLinesInFile:%d, scores:%s" % (alldata[-1]["generationNumber"],len(alldata), bestFitnesPerGen))
best, = plt.plot(bestFitnesPerGen, '-r.')
averageBestPerGen = [sum(alldata[i]["bestFitnesses"])/len(alldata[i]["bestFitnesses"]) for i in range(len(alldata))]
average, = plt.plot(averageBestPerGen, '-b.')
plt.xlabel("number of the generation")
plt.xticks(range(len(alldata)+1))
plt.ylabel("Fitnessscore")
plt.legend([best,average], ["Best of the generation", "Average of the generation"])
plt.axis([0, len(alldata), 0, np.amax(bestFitnesPerGen)+10]) #[xMin,xMax,yMin,yMax]
def writeBestFitnessesToFile(fitnessScores, generationNumber):
with open(str("mytestFile.txt"), 'a+') as file:
dataAsString = '{"generationNumber" : %d, "bestFitnesses" : %s}\n' % (generationNumber, fitnessScores)
file.write(dataAsString)
def startTraining(numberOfGenerations, generationSize):
#.other code but irrelevant for question.
testFitnesses = [random.randint(2,100) for i in range(generationSize)]
scoredFitnesses = sorted(testFitnesses,reverse=True)
writeBestFitnessesToFile(scoredFitnesses,0)
graphFitnessScores(str("mytestFile.txt"))
for i in range(1,numberOfGenerations+1):
nextGeneration = initGeneration(i, generationSize)
plt.show()
def initGeneration(generationNumber, generationSize):
testFitnesses = [random.randint(2,100) for i in range(generationSize)]
scoredNewGeneration = sorted(testFitnesses,reverse=True)
writeBestFitnessesToFile(scoredNewGeneration,generationNumber)
graphFitnessScores(str("mytestFile.txt"))
startTraining(3,100)
Я использую Python 3.6.4
Чтобы этот код работал правильно, пожалуйста, удалитесодержимое файла «myTestFile.txt» перед каждым выполнением.
оператор печати в graphFitnessScore печатает:
generation 0, amountOfLinesInFile:1, scores:[99]
generation 1, amountOfLinesInFile:2, scores:[99, 100]
generation 2, amountOfLinesInFile:3, scores:[99, 100, 100]
generation 3, amountOfLinesInFile:4, scores:[99, 100, 100, 98]
И файл «mytestFile.txt» выглядит так после окончательного оператора печати:
{"generationNumber" : 0, "bestFitnesses" : [99, 97, 96, 96, 94, 93, 93, 92, 92, 91, 91, 90, 89, 89, 88, 88, 86, 86, 85, 84, 84, 83, 83, 81, 80, 78, 78, 77, 77, 74, 72, 71, 70, 70, 67, 67, 67, 66, 65, 65, 64, 63, 63, 61, 59, 58, 58, 56, 56, 56, 56, 55, 55, 54, 52, 51, 50, 49, 48, 48, 46, 46, 46, 45, 43, 41, 41, 41, 41, 41, 40, 39, 39, 38, 38, 33, 32, 30, 27, 26, 24, 24, 20, 18, 17, 17, 15, 14, 13, 13, 10, 10, 10, 9, 9, 5, 5, 5, 2, 2]}
{"generationNumber" : 1, "bestFitnesses" : [100, 100, 100, 99, 99, 96, 95, 91, 90, 90, 90, 90, 90, 89, 89, 88, 88, 88, 87, 86, 86, 85, 85, 85, 85, 84, 84, 84, 83, 82, 82, 78, 78, 77, 74, 73, 73, 71, 68, 66, 65, 64, 63, 62, 62, 61, 60, 59, 59, 58, 57, 56, 55, 55, 54, 54, 53, 50, 47, 47, 47, 45, 43, 42, 41, 41, 41, 40, 39, 37, 36, 36, 35, 34, 32, 32, 32, 31, 30, 29, 28, 26, 23, 23, 21, 20, 20, 20, 18, 17, 17, 16, 14, 14, 14, 12, 12, 11, 5, 5]}
{"generationNumber" : 2, "bestFitnesses" : [100, 99, 97, 97, 97, 95, 94, 93, 90, 90, 90, 89, 89, 89, 89, 87, 86, 86, 83, 83, 82, 82, 79, 75, 75, 73, 72, 72, 71, 71, 70, 69, 69, 65, 64, 63, 62, 62, 61, 60, 59, 59, 58, 58, 58, 55, 53, 53, 52, 51, 49, 46, 45, 45, 45, 45, 45, 44, 44, 41, 41, 41, 40, 40, 39, 37, 36, 36, 36, 33, 32, 31, 28, 27, 26, 25, 22, 22, 22, 22, 19, 18, 17, 16, 16, 15, 13, 13, 12, 11, 8, 7, 7, 7, 5, 5, 3, 3, 2, 2]}
{"generationNumber" : 3, "bestFitnesses" : [98, 98, 97, 95, 95, 95, 92, 91, 90, 90, 90, 89, 89, 88, 88, 87, 86, 86, 85, 85, 84, 84, 83, 81, 81, 81, 80, 80, 78, 75, 73, 73, 72, 71, 71, 70, 69, 68, 66, 66, 65, 64, 64, 63, 63, 63, 63, 62, 61, 60, 59, 57, 57, 55, 55, 53, 51, 50, 49, 47, 46, 45, 44, 40, 40, 39, 39, 38, 35, 35, 34, 32, 28, 26, 25, 24, 24, 23, 22, 22, 19, 19, 19, 17, 15, 14, 14, 10, 9, 8, 7, 6, 6, 5, 4, 3, 3, 2, 2, 2]}
Но график никогда не отображает последний счет массива.Так что для последней итерации он показывает: 