【问题标题】:ValueError: possible array in wrong dimensions?ValueError:可能的数组尺寸错误?
【发布时间】:2017-05-25 17:54:27
【问题描述】:

我正在尝试根据游戏输入训练神经网络。原始代码只有 3 个键输入:a、w、d。我正在尝试将其更改为 9:a、w、d、s、aw、wd、sa、sd、nokeys。现在在训练模型时,我得到一个 ValueError,表明某个数组的尺寸错误。但是我找不到任何链接回我可以更改为 9 的 3 个键的东西,所以我有点不知所措。

这是错误信息:

    Traceback (most recent call last):
  File "C:\Users\StefBrands\Documents\GitHub\pygta5 - Copy\train_model.py", line 28, in <module>
    snapshot_step=500, show_metric=True, run_id=MODEL_NAME)
  File "C:\Users\StefBrands\AppData\Local\Programs\Python\Python35\lib\site-packages\tflearn\models\dnn.py", line 215, in fit
    callbacks=callbacks)
  File "C:\Users\StefBrands\AppData\Local\Programs\Python\Python35\lib\site-packages\tflearn\helpers\trainer.py", line 336, in fit
    show_metric)
  File "C:\Users\StefBrands\AppData\Local\Programs\Python\Python35\lib\site-packages\tflearn\helpers\trainer.py", line 777, in _train
    feed_batch)
  File "C:\Users\StefBrands\AppData\Local\Programs\Python\Python35\lib\site-packages\tensorflow\python\client\session.py", line 778, in run
    run_metadata_ptr)
  File "C:\Users\StefBrands\AppData\Local\Programs\Python\Python35\lib\site-packages\tensorflow\python\client\session.py", line 961, in _run
    % (np_val.shape, subfeed_t.name, str(subfeed_t.get_shape())))
ValueError: Cannot feed value of shape (64, 4) for Tensor 'targets/Y:0', which has shape '(?, 3)'

这是数据平衡发生的地方:

    # balance_data.py

import numpy as np
import pandas as pd
from collections import Counter
from random import shuffle
import sys

train_data = np.load('training_data-1.npy')

df = pd.DataFrame(train_data)
print(df.head())
print(Counter(df[1].apply(str)))

w = []
a = []
d = []
s = []
wa = []
wd = []
sd = []
sa = []
nk = []

shuffle(train_data)

for data in train_data:
    img = data[0]
    choice = data[1]
    print(choice)

    if choice == [0,1,0,0]:
        w.append([img,choice])
    elif choice == [1,0,0,0]:
        a.append([img,choice])
    elif choice == [0,0,1,0]:
        d.append([img,choice])
    elif choice == [0,0,0,1]:
        s.append([img,choice])
    elif choice == [1,1,0,0]:
        wa.append([img,choice])
    elif choice == [0,1,1,0]:
        wd.append([img,choice])
    elif choice == [0,0,1,1]:
        sd.append([img,choice])
    elif choice == [1,0,0,1]:
        sa.append([img,choice])
    elif choice == [0,0,0,0]:
        nk.append([img,choice])
    else:
        print('no matches')

min_length = 10000


##lengths = [len(x) for x in (w, a, d, s, wa, wd, sd, sa, nk)]
##print (lengths)

min_length = min(len(x)-1 for x in (w, a, d, s, wa, wd, sd, sa, nk))
for x in (w, a, d, s, wa, wd, sd, sa, nk):
    x = x[min_length]


##lengthsafter = [len(x) for x in (w, a, d, s, wa, wd, sd, sa, nk)]
##print (lengths)

final_data = w + a + d + s + wa + wd + sd + sa + nk
shuffle(final_data)

np.save('training_data-1-balanced.npy', final_data)

这是我在尝试训练模型时遇到错误的地方:

 # train_model.py

import numpy as np
from alexnet import alexnet
WIDTH = 160
HEIGHT = 120
LR = 1e-3
EPOCHS = 8
MODEL_NAME = 'pygta5-car-fast-{}-{}-{}-epochs-300K-data.model'.format(LR, 'alexnetv2',EPOCHS)

model = alexnet(WIDTH, HEIGHT, LR)

hm_data = 22
for i in range(EPOCHS):
    for i in range(1,hm_data+1):
        train_data = np.load('training_data-{}-balanced.npy'.format(i))

        train = train_data[:-100]
        test = train_data[-100:]

        X = np.array([i[0] for i in train]).reshape(-1,WIDTH,HEIGHT,1)
        Y = [i[1] for i in train]

        test_x = np.array([i[0] for i in test]).reshape(-1,WIDTH,HEIGHT,1)
        test_y = [i[1] for i in test]

        model.fit({'input': X}, {'targets': Y}, n_epoch=1, validation_set=({'input': test_x}, {'targets': test_y}), 
            snapshot_step=500, show_metric=True, run_id=MODEL_NAME)

        model.save(MODEL_NAME)

我知道这不是最明显的问题,但我不知道在哪里解决这个问题。如果需要更多链接到的代码,请告诉我,我会尽快提供。

编辑: 添加了tensorflow代码:

    # alexnet.py

""" AlexNet.
References:
    - Alex Krizhevsky, Ilya Sutskever & Geoffrey E. Hinton. ImageNet
    Classification with Deep Convolutional Neural Networks. NIPS, 2012.
Links:
    - [AlexNet Paper](http://papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks.pdf)
"""

import tflearn
from tflearn.layers.conv import conv_2d, max_pool_2d
from tflearn.layers.core import input_data, dropout, fully_connected
from tflearn.layers.estimator import regression
from tflearn.layers.normalization import local_response_normalization

def alexnet(width, height, lr):
    network = input_data(shape=[None, width, height, 1], name='input')
    network = conv_2d(network, 96, 11, strides=4, activation='relu')
    network = max_pool_2d(network, 3, strides=2)
    network = local_response_normalization(network)
    network = conv_2d(network, 256, 5, activation='relu')
    network = max_pool_2d(network, 3, strides=2)
    network = local_response_normalization(network)
    network = conv_2d(network, 384, 3, activation='relu')
    network = conv_2d(network, 384, 3, activation='relu')
    network = conv_2d(network, 256, 3, activation='relu')
    network = max_pool_2d(network, 3, strides=2)
    network = local_response_normalization(network)
    network = fully_connected(network, 4096, activation='tanh')
    network = dropout(network, 0.5)
    network = fully_connected(network, 4096, activation='tanh')
    network = dropout(network, 0.5)
    network = fully_connected(network, 3, activation='softmax')
    network = regression(network, optimizer='momentum',
                         loss='categorical_crossentropy',
                         learning_rate=lr, name='targets')

    model = tflearn.DNN(network, checkpoint_path='model_alexnet',
                        max_checkpoints=1, tensorboard_verbose=0, tensorboard_dir='log')

    return model

【问题讨论】:

  • 你实际上并没有分享任何 TensorFlow 代码,所以很难说发生了什么,但无论如何,看起来问题出在输出上,而不是输入上。给定目标的大小似乎为 4(我猜是四个类别?),而模型预期为 3。
  • 我添加了我希望是正确的 tensorflow 代码。但我也不知道这 3 是在哪里说的。
  • 我会说它是 softmax 层中的那个。我无法判断的是 3 应该是 4 还是 Y 应该是 64x3 而不是 64x4。
  • 它现在运行没有错误,只希望它做正确的事情。谢谢!

标签: python tensorflow


【解决方案1】:

您应该将类​​的数量从 3 个更改为 9 个,并为 9 个类中的每一个使用一种热编码。例如,如果您的类是 a、w、d、s、aw、wd、sa、sd、nokeys,则应将 aw 编码为 [0, 0, 0, 0, 1, 0, 0, 0, 0]。在此编码之后,如果在 tensorflow 模型的 softmax 层中将 3 替换为 9,它应该可以正常工作。(与 network = fully_connected(network, 3, activation='softmax') 一致)

【讨论】:

  • 您的描述有点难以理解。前两个句子的具体代码示例,加上它们在代码中的位置,将极大地增加它的清晰度。
猜你喜欢
  • 1970-01-01
  • 2021-09-14
  • 1970-01-01
  • 2012-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多