Rede neural Tensorflow TypeError: o argumento de busca tem um tipo inválido

11

Estou criando uma rede neural simples usando o tensorflow, com os dados coletados por mim mesmo, no entanto, não está cooperando: o PI encontrou um erro que não consigo corrigir ou encontrar, e eu adoraria sua ajuda.

A mensagem de erro:

TypeError: o argumento de busca 2861.6152 de 2861.6152 possui um tipo inválido, deve ser uma sequência ou um Tensor. (Não é possível converter um float32 em um tensor ou operação.)

O erro refere-se à seguinte linha no meu código:

_, cost = tf_session.run([optimizer, cost], feed_dict = {champion_data: batch_input, item_data: batch_output})

Eu já descobri que o erro não ocorre quando eu comento as seguintes linhas no meu código:

prediction = neural_network_model(champion_data)
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(prediction, item_data))
optimizer = tf.train.AdamOptimizer().minimize(cost)
_, cost = tf_session.run([optimizer, cost], feed_dict = {champion_data: batch_input, item_data: batch_output})

Então, em algum lugar, uma dessas linhas está obtendo algo que não parece exatamente como ele espera. Eu já tentei o óbvio (remover o np.array () de batch_input e batch_output ou substituí-lo por list ()), mas isso não resolve o problema. Minha hipótese atual é que a saída de neural_network_model (champion_data) seja de alguma forma da forma ou do tipo errado, no entanto, não tenho certeza de como testá-lo ou resolvê-lo, se esse for o caso.

O código completo pode ser encontrado aqui: https://gist.github.com/HasseIona/4bcaf9f95ae828e056d5210a2ea07f88

Editar: verifiquei que os dados do campeão que são inseridos no neural_network_model, a previsão e o custo são todos tensores. Eu tenho tentado resolver o problema usando a hipótese de que o problema, de alguma forma, está na parte feed_dict = {} do código, mas não chega a lugar nenhum até agora

Hasse Iona
fonte

Respostas:

17

O problema estava no uso do nome 'cost' em duas ocasiões, o problema foi resolvido alterando-se isso:

_, cost = tf_session.run([optimizer, cost], feed_dict = {champion_data: batch_input, item_data: batch_output})

para isso:

_, c = tf_session.run([optimizer, cost], feed_dict = {champion_data: batch_input, item_data: batch_output})

Dessa forma, o nome da variável 'c' não entra mais em conflito com a parte [otimizador, custo] do código.

Hasse Iona
fonte
resposta incrivelmente útil
lenhhoxung 19/03/19