質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Q&A

1回答

3165閲覧

K最近傍法を用いた画像の分類

SAMLY

総合スコア7

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

0グッド

1クリップ

投稿2018/01/11 14:12

###前提・実現したいこと
K最近傍法で画像の2クラス分類を行っています.
MNIST以外のデータ画像を用いたいと考えていて先日質問させていただき,いいアドバイスをいただいたのですが以下のようなサイズが合わないという別のエラーが生じています.
2000は学習枚数,36.48は画像の高さと幅,1728は画素数の合計なのは把握していますがどうしてこのようなエラーが生じたか,またどうすれば解決し,実行できるかが不明です.

###発生している問題・エラーメッセージ

Traceback (most recent call last): File "train9.py", line 54, in <module> predicted_value = sess.run(pred,feed_dict={x_train:X_traning, y_train:Y_traning, x_test:X_test[i,:]}) File "C:\Users\LIP\Anaconda3\envs\tensorflow\lib\site-packages\tensorflow\python\client\session.py", line 889, in run run_metadata_ptr) File "C:\Users\LIP\Anaconda3\envs\tensorflow\lib\site-packages\tensorflow\python\client\session.py", line 1096, in _run % (np_val.shape, subfeed_t.name, str(subfeed_t.get_shape()))) ValueError: Cannot feed value of shape (2000, 36, 48) for Tensor 'Placeholder:0', which has shape '(?, 1728)'

###該当のソースコード

Python

1#K近傍法のコード 2import tensorflow as tf 3import numpy as np 4from load_dataset import load_dataset 5 6 7# 学習データ 8X_traning,Y_traning = load_dataset('./train_dataset',convert_type='RGB',flatten=True,normalize=True,one_hot_label=True) 9X_test,Y_test = load_dataset('./test_dataset',convert_type='RGB',flatten=True,normalize=True,one_hot_label=True) 10 11 12# モデルの入出力の設定 13x_train = tf.placeholder(tf.float32, [None,48*36]) #traning input 14y_train = tf.placeholder(tf.float32, [None,2]) #traning label 15x_test = tf.placeholder(tf.float32, [48*36]) #testing input 16 17# 比較する近傍ベクトルの数を設定 18K = 3 19nearest_neighbors = tf.Variable(tf.zeros([K])) 20 21# 入力ベクトルと近傍ベクトルの距離を計算 22distance = tf.negative(tf.reduce_sum(tf.abs(tf.add(x_train, tf.negative(x_test))),axis=1)) #L1 23# 上でマイナスを付けたので、大きい順に取り出せばいい 24values, indices = tf.nn.top_k(distance, k=K, sorted=False) 25 26# 近傍値を保存するリスト 27nn_vector = [] 28for i in range(K): 29 nn_vector.append(tf.argmax(y_train[indices[i]], 0)) 30 31# 近傍ベクトルのリストをtensorflowの変数へ変換する 32nearest_neighbors = nn_vector 33 34# クラスラベル、そのインデックス、個数を計算 35y, idx, count = tf.unique_with_counts(nearest_neighbors) 36""" 37例: 38x = [1, 1, 2, 4, 4, 4, 7, 8, 8] 39y, idx, count = unique_with_counts(x) 40y ==&gt; [1, 2, 4, 7, 8] 41idx ==&gt; [0, 0, 1, 2, 2, 2, 3, 4, 4] 42count ==&gt; [2, 1, 3, 1, 2] 43""" 44 45# 最も個数の多いクラスを取り出す 46pred = tf.slice(y, begin=[tf.argmax(count, 0)], size=tf.constant([1], dtype=tf.int64))[0] 47# y = [ 1, 2, 3, 4, 11] count = [3, 2, 2, 7, 1] の時、 1を返す 48 49accuracy = 0 50init = tf.global_variables_initializer() 51 52with tf.Session() as sess: 53 54 for i in range(X_test.shape[0]): 55 predicted_value = sess.run(pred,feed_dict={x_train:X_traning, y_train:Y_traning, x_test:X_test[i,:]}) 56 57 print("Test", i, "Prediction", predicted_value, "True Class:", np.argmax(Y_test[i])) 58 59 if predicted_value == np.argmax(Y_test[i]): 60 accuracy += 1.0 61 62 accuracy /= len(Y_test) 63 print("Accuracy:", accuracy)
#読み込むデータファイルのコード from PIL import Image import numpy as np import os try: import urllib.request except ImportError: raise ImportError('You should use Python 3.x') import os.path import gzip import pickle import cv2 def _load_label(file_dir): data_files = os.listdir(file_dir) labels = [] for file in data_files: l = file.split('-')[0] if(l == 'face'): labels.append(0) elif(l == 'non-face'): labels.append(1) print("Load label : Done!") return np.array(labels) def _load_img(file_dir,convert_type='L'): data_files = os.listdir(file_dir) imgs = [] for file in data_files: img = np.frombuffer(np.array(Image.open(file_dir+'/'+file).convert(convert_type)),dtype=np.uint8) img = cv2.resize(img, (48, 36)) imgs.append(img) print("Load img : Done!") return np.array(imgs) def _change_one_hot_label(X): #2のところは分類したいクラスの数 T = np.zeros((X.size, 2)) for idx, row in enumerate(T): row[X[idx]] = 1 return T def load_dataset(DIR_PATH,convert_type='L',normalize=True,flatten=True,one_hot_label=False): labels = _load_label(DIR_PATH) imgs = _load_img(DIR_PATH,convert_type) if normalize: imgs = imgs.astype(np.float32) imgs /= 255.0 if not flatten: #用意した画像サイズ(48*36) if(convert_type == 'L'): imgs = imgs.reshape(-1,1,48,36) elif(convert_type == 'RGB'): imgs = imgs.reshape(-1,3,48,36) if one_hot_label: labels = _change_one_hot_label(labels) return imgs,labels

###試したこと
K近傍法のコードと読み込むデータのコードの作成を行いました.
画像は48×32画素のものを用いています.
学習枚数は2000枚,テスト枚数は400枚です.

###補足情報(言語/FW/ツール等のバージョンなど)
Windows10 (64bit)
Python 3.5.4(仮想環境)(Anaconda4.4.0(64bit))
TensorFlow 1.4.0

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

x_train = tf.placeholder(tf.float32, [None,48,36])
x_test = tf.placeholder(tf.float32, [48,36])
もしくは
predicted_value = sess.run(pred, feed_dict={x_train:X_traning.reshape(-1,48*36), y_train:Y_traning, x_test:X_test[i,:].reshape(-1,48*36)})

投稿2018/01/11 15:56

mkgrei

総合スコア8560

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問