Python ValueError:可能数组的维度错误?
我正在尝试训练一个关于游戏输入的神经网络。原始代码只有3个关键输入:a、w、d。我试着把它改成9:a,w,d,s,aw,wd,sa,sd,nokeys。现在,在训练模型的过程中,我得到了一个ValueError,表明数组的某个地方的维数是错误的。但我找不到任何链接回3键,我可以改成9键,所以我有点不知所措 以下是错误消息:Python ValueError:可能数组的维度错误?,python,tensorflow,Python,Tensorflow,我正在尝试训练一个关于游戏输入的神经网络。原始代码只有3个关键输入:a、w、d。我试着把它改成9:a,w,d,s,aw,wd,sa,sd,nokeys。现在,在训练模型的过程中,我得到了一个ValueError,表明数组的某个地方的维数是错误的。但我找不到任何链接回3键,我可以改成9键,所以我有点不知所措 以下是错误消息: Traceback (most recent call last): File "C:\Users\StefBrands\Documents\GitHub\pyg
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)'
这就是我在尝试训练模型时出错的原因:
# 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
您应该将类的数量从3更改为9,并对9个类中的每个类使用一个热编码。例如,如果您的类是a、w、d、s、aw、wd、sa、sd、nokeys,则应将aw编码为[0、0、0、0、1、0、0、0]。编码完成后,如果在tensorflow模型的softmax层中用9替换3应该可以正常工作。(在network=fully_connected(network,3,activation='softmax'))的行中,您实际上没有共享任何tensorflow代码,因此很难说发生了什么,但无论如何,问题似乎出在输出中,不是输入。给定的目标似乎大小为4(我猜是四个类),而模型预期为3。我添加了我希望是正确的tensorflow代码。但我也不知道这3个在哪里,我想说的是在softmax层。我不知道3应该是4还是Y应该是64x3而不是64x4。它现在运行没有错误,希望它做的是正确的。谢谢你的描述有点难以理解。前两句的具体代码示例,加上它们在代码中的位置,将极大地提高代码的清晰度。
# 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