2017-05-25 46 views
-1

我正試圖在遊戲輸入上訓練一個神經網絡。原始代碼只有3個關鍵輸入:a,w,d。我試圖把它改爲9:a,w,d,s,aw,wd,sa,sd,nokeys。現在在訓練模型時,我得到一個ValueError,表明某個數組在某個地方是錯誤的。但我找不到任何連接回3鍵的東西,我可以改變爲9,所以我有點茫然。ValueError:可能的數組尺寸錯誤?

這裏的錯誤消息:

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) 

我知道這不是最明顯的問題,但我不知道該如何解決此問題UE。如果需要鏈接的更多代碼,請讓我知道,我會盡快提供。

編輯: 添加了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 
+0

你沒有實際上共享任何TensorFlow代碼,所以很難說出發生了什麼,但無論如何,看起來問題出在輸出中,而不是輸入。給定的目標似乎大小爲4(我猜是四個類),而模型預期爲3. – jdehesa

+0

我已經添加了我希望的正確張量流代碼。但我也不知道這3條是在哪裏陳述的。 – mtbrands

+0

我會說這是softmax圖層中的一個。我無法分辨的是這3個應該是4還是'Y'應該是64x3而不是64x4。 – jdehesa

回答

0

你應該從3改變的班至9的數字,並使用一個熱碼爲每個9類。例如,如果您的類是a,w,d,s,aw,wd,sa,sd,nokeys,則應將aw編碼爲[0,0,0,0,1,0,0,0,0]。在這種編碼之後,如果在張量流模型的softmax層中用9代替3,它應該可以正常工作(在network = fully_connected(network,3,activation ='softmax'))

+0

你的描述有點難以遵循。前兩個句子的具體代碼樣本,加上它們在代碼中的位置,將極大地增加其清晰度。 –