私はゲームの入力に神経ネットワークを訓練しようとしています。元のコードには、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
実際にはTensorFlowコードを共有しているので、何が起こっているのかは分かりませんが、いずれの場合でも、問題は入力ではなく出力にあるように見えます。モデルが期待している間、与えられたターゲットはサイズ4(4つのクラス、私は推測しますか?)と思われます。 – jdehesa
私は正しいテンソルフローコードが何かを追加しました。しかし、私はまた、この3がどこに述べられているのか分かりません。 – mtbrands
私はそれがソフトマックス層のものだと言いたいと思います。私が知ることができないのは、3が4でなければならないか、または「Y」が64x4ではなく64x3であるかどうかということです。 – jdehesa