2017-05-25 16 views
-1

私はゲームの入力に神経ネットワークを訓練しようとしています。元のコードには、a、w、dの3つのキー入力しかありませんでした。私はこれを9:a、w、d、s、aw、wd、sa、sd、nokeysに変更しようとしています。今はモデルを訓練する際に、配列の次元が間違っていることを示すValueErrorを取得します。しかし、私は9に変更することができる3つのキーに戻る何かを見つけることができないので、私は少し失われています。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) 

私はこれが最も明確な問題ではないことを理解していますが、私はこのissを修正する手がかりがありません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(4つのクラス、私は推測しますか?)と思われます。 – jdehesa

+0

私は正しいテンソルフローコードが何かを追加しました。しかし、私はまた、この3がどこに述べられているのか分かりません。 – mtbrands

+0

私はそれがソフトマックス層のものだと言いたいと思います。私が知ることができないのは、3が4でなければならないか、または「Y」が64x4ではなく64x3であるかどうかということです。 – jdehesa

答えて

0

あなたは3から9までのクラスの番号を変更し、9クラスごとに1つのホットエンコーディングを使用する必要があります。たとえば、クラスがa、w、d、s、aw、wd、sa、sd、nokeysの場合、awを[0、0、0、0、1、0、0、0、0]としてエンコードする必要があります。このエンコーディングの後で、テンソルフローモデルのsoftmaxレイヤーで3を9に置き換えると、正常に動作するはずです(network = 3、activation = 'softmax')の行)

+0

説明が少し難しいです。あなたの最初の2つの文章の具体的なコードサンプルとそれらがコードのどこに属しているかは、その明快さに非常にプラスになります。 –

関連する問題