Я новичок в Python и пытаюсь интегрировать выборку из моей проблемной области в питоне и получаю следующее сообщение об ошибке:не может манипулировать списки
sum_square_error += (output[0:1] - expected) ** 2
TypeError: unsupported operand type(s) for -: 'list' and 'list'
Программа:
from __future__ import print_function
import os
import numpy as np
import sys as sys
from neat import nn, population, statistics
# Network inputs and expected outputs.
#xor_inputs = [[0.0, 0.0], [0.0, 1.0], [1.0, 0.0], [1.0, 1.0]]
#xor_outputs = [0.0, 1.0, 1.0, 0.0]
xor_inputs = [[-14.7569, 17.9667, -55.0074, -0.218445, 0.835469, 11.23]]
''',
[-23.8745,7.40331,-48.5434,0.114681,-0.0208769,15.2138],
[-22.2368,7.02313,-54.734,0.0633238,-0.097209,12.7707],
[-19.0957,7.03371,-48.6117,0.108994,-0.0357287,15.205]]
'''
xor_outputs = [[-31.1812, 47.2076, -34.9315, 62.6799]]
''',
[-53.9514,97.2412,55.7927,92.506],
[-27.417,47.7492,-28.1557,78.6016],
[-57.4506,99.2558,55.7436,92.3611]]
'''
def eval_fitness(genomes):
for g in genomes:
net = nn.create_feed_forward_phenotype(g)
sum_square_error = 0.0
for inputs, expected in zip(xor_inputs, xor_outputs):
# Serial activation propagates the inputs through the entire network.
output = net.serial_activate(inputs)
# print(xor_inputs[0:1])
# print(xor_outputs[0:1])
# sys.exit(0)
sum_square_error += (output[0] - expected) ** 2
# When the output matches expected for all inputs, fitness will reach
# its maximum value of 1.0.
g.fitness = 1 - sum_square_error
local_dir = os.path.dirname(__file__)
config_path = os.path.join(local_dir, 'xor2_config')
pop = population.Population(config_path)
pop.run(eval_fitness, 300)
# Log statistics.
statistics.save_stats(pop.statistics)
statistics.save_species_count(pop.statistics)
statistics.save_species_fitness(pop.statistics)
print('Number of evaluations: {0}'.format(pop.total_evaluations))
# Show output of the most fit genome against training data.
winner = pop.statistics.best_genome()
print('\nBest genome:\n{!s}'.format(winner))
print('\nOutput:')
winner_net = nn.create_feed_forward_phenotype(winner)
for inputs, expected in zip(xor_inputs, xor_outputs):
output = winner_net.serial_activate(inputs)
print("expected {0:1.5f} got {1:1.5f}".format(expected, output[0]))
Я искала и обнаружил, что он должен быть преобразован в массив numpy. Когда я конвертировать xor_inputs и xor_outputs в Numpy массивов, то он говорит:
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
Следует отметить, что первоначальная проблема исключающего имеет 2 входа в 2d массива и 1 выход в выходном массиве 1d. В моей проблеме у меня есть 6 входов в 2d-массиве и 4 выхода в 2d-массиве.
На каком коде была сделана эта ошибка 'ValueError: значение истинности массива с более чем одним элементом неоднозначно ...' произойдет? – Akihiko
Замена 'output [0: 1]' by 'output [0]' исправит первую указанную вами ошибку. Последний элемент, который вы хотите, первый - это список из 1 элемента, который содержит этот элемент. –