🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

2043閲覧

t-SNEを使う際のエラーpython

kusegasugoi0221

総合スコア11

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2020/12/09 18:18

編集2020/12/11 00:26

tSNEで次元削減をしようと考えています。
具体的にいうと、画像一枚が(1,7,7,2048)の特徴量のものが1152枚あって、一つにまとめて(1152,1,7,7,2048)の配列を作って、tSNEで次元削減で2次元化(1152,何かしらの数字)にしたいと考えています。それにより画像をマッピングしたいと考えています。
実際にコードを作成したのですが、つぎのようなエラーが発生しました。
以下のエラーをみるとt-SNEは構造が二次元以下のものしか使えない、つまり(A,B)のものを次元削減して(A,2)にするのかなと思いました。実際に私が考えているようにするにはどのようにしたらよろしいでしょうか。一番最後の実際に作ったコードも載せておきます。python初心者でt-SNEの理解も薄いのですが、わかる方がいらしたら教えてください。よろしくお願いします。

#実際のエラー

Traceback (most recent call last): File "C:\Users\Desktop\resyuu.py", line 142, in <module> main() File "C:\Users\Desktop\resyuu.py", line 100, in main X_embeddedsc = tSNE(X,seikika) File "C:\Users\Desktop\resyuu.py", line 39, in tSNE X_embedded = tsne.fit_transform(X) File "C:\anaconda\lib\site-packages\sklearn\manifold\_t_sne.py", line 891, in fit_transform embedding = self._fit(X) File "C:\anaconda\lib\site-packages\sklearn\manifold\_t_sne.py", line 671, in _fit dtype=[np.float32, np.float64]) File "C:\anaconda\lib\site-packages\sklearn\base.py", line 420, in _validate_data X = check_array(X, **check_params) File "C:\anaconda\lib\site-packages\sklearn\utils\validation.py", line 72, in inner_f return f(**kwargs) File "C:\anaconda\lib\site-packages\sklearn\utils\validation.py", line 641, in check_array % (array.ndim, estimator_name)) ValueError: Found array with dim 5. Estimator expected <= 2.

#実際のコード

# -*- coding: utf-8 -* import glob import cv2 import numpy as np import time from tqdm import tqdm from skimage import feature,exposure from keras.models import model_from_json from keras.utils.vis_utils import plot_model from keras.models import Model import pandas as pd from matplotlib import pylab as plt from sklearn.manifold import TSNE from sklearn.preprocessing import StandardScaler from sklearn.preprocessing import MinMaxScaler # 特徴量抽出 def create_images_array(load_img_paths,model,layer_name): imgs=[] middle_layer_model = Model(inputs=model.input, outputs=model.get_layer(layer_name).output) for load_img_path in tqdm(load_img_paths): img = cv2.imread(load_img_path) #型を合わせる。255は正規化のため。 target = np.reshape(img, (1, img.shape[0], img.shape[1], img.shape[2])).astype('float') / 255.0 middle_output = middle_layer_model.predict(target) imgs.append(middle_output) return np.array(imgs,np.float32) def tSNE(X,seikika): #データの正規化 #seikika.fit(X) #X_pre_emb = seikika.transform(X) #tSNEの適用 tsne = TSNE(n_components=2, random_state=0) X_embedded = tsne.fit_transform(X) print('X_embedded') print(X_embedded) print(X_embedded.shape) #tSNEで次元削減したデータの正規化 X_2d= seikika.fit_transform(X_embedded) print('X_2d') print(X_2d.shape) #print(X_2d) return X_2d def main(): t1 = time.time() json_string = open('./preprocess_images_keras_2class/case3/model.json').read() model = model_from_json(json_string) model.load_weights('./preprocess_images_keras_2class/case3/weight.hdf5') layer_name = 'conv5_block3_out' # 学習用の画像ファイルの格納先(FEのT1~T8,WのT1~T8) LOAD_TRAIN_IMG1S_PATH = './preprocess_images_keras/case3/train/T1-FE/*' LOAD_TRAIN_IMG2S_PATH = './preprocess_images_keras/case3/train/T2-FE/*' LOAD_TRAIN_IMG3S_PATH = './preprocess_images_keras/case3/train/T3-FE/*' # 学習用の画像ファイルのパスを取得 load_img1_paths = glob.glob(LOAD_TRAIN_IMG1S_PATH) load_img2_paths = glob.glob(LOAD_TRAIN_IMG2S_PATH) load_img3_paths = glob.glob(LOAD_TRAIN_IMG3S_PATH) # 学習用の画像ファイルをロードし特徴量抽出 imgs1 = create_images_array(load_img1_paths,model,layer_name) imgs2 = create_images_array(load_img2_paths,model,layer_name) imgs3 = create_images_array(load_img3_paths,model,layer_name) X = np.r_[imgs1, imgs2, imgs3] # 正解ラベルを生成imgs.番号でラベルを決める #2種類分類 labels1 = np.full(len(load_img1_paths), 0, np.int32) labels2 = np.full(len(load_img2_paths), 0, np.int32) labels3 = np.full(len(load_img3_paths), 1, np.int32) label = np.r_[labels1, labels2, labels3] #正規化 seikika = StandardScaler() #seikika = MinMaxScaler() X_embeddedsc = tSNE(X,seikika) #print(X_embeddedsc) # グラフを横長にする from matplotlib.pylab import rcParams rcParams['figure.figsize'] = 15, 6 import matplotlib as mpl mpl.rcParams['font.family'] = ['serif'] #2種類分類のプロット print("-----------------------------------------------------------") # 可視化の用意 color_list = ["blue", "red"] marker_list = ["o", "^"] label_list = ["FE", "W"] plt.figure(figsize=(7,7)) plt.title("feautures") #plt.tick_params(labelsize=16) plt.xlabel("t-SNE comp-1") plt.ylabel("t-SNE comp-2") for index in range(len(np.unique(label))): plt.scatter(X_embeddedsc[label==index,0], X_embeddedsc[label==index,1], edgecolor=color_list[index],color=color_list[index], marker=marker_list[index], label=label_list[index]) plt.legend(loc="upper right") plt.show() print("-----------------------------------------------------------\n\n") t2 = time.time() elapsed_time = (t2-t1)/3600 print(f"経過時間:{elapsed_time}") if __name__ == '__main__': main()

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

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

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

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

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

jbpb0

2020/12/10 00:00

(1152,1,7,7,2048)をreshapeして(1152,7*7*2048)=(1152,100352)にするのはダメなのでしょうか?
kusegasugoi0221

2020/12/10 02:23

コメントありがとうございます。reshapeをあまり理解していなくて調べてみたところ配列を組み替えるとのことですが(1152,1,7,7,2048)の(1152,)の部分を維持したまま残りの(,1,7,7,2048)をreshapeで(1152,100352)にするには,np.reshape(a, [1152, 100352])のコードで大丈夫なのでしょうか。 言い方が抽象的になってすみません。
jbpb0

2020/12/10 02:58 編集

たとえば、以下のようにして、どのように形が変わるか確認されたらいいと思います import numpy as np xxx = np.arange(90).reshape(5, 1, 3, 3, 2) print(xxx) print(xxx.shape) xxx2 = np.reshape(xxx, [np.shape(xxx)[0], -1]) print(xxx2) print(xxx2.shape) 自動的に決まる数字は、-1と書けます https://qiita.com/yosshi4486/items/deb49d5a433a2c8a8ed4
kusegasugoi0221

2020/12/11 00:07

上手く実行できました。コードだけじゃなく考え方もわかることができました。 ありがとうございました。
guest

回答1

0

自己解決

def create_images_array(load_img_paths,model,layer_name): imgs=[] middle_layer_model = Model(inputs=model.input, outputs=model.get_layer(layer_name).output) for load_img_path in tqdm(load_img_paths): img = cv2.imread(load_img_path) #型を合わせる。255は正規化のため。 target = np.reshape(img, (1, img.shape[0], img.shape[1], img.shape[2])).astype('float') / 255.0 middle_output = middle_layer_model.predict(target) imgs.append(middle_output) return np.array(imgs,np.float32)

ここの部分のimgs.append(middle_output)の後にreshapeのコードを入れることで無事実行できました
具体的にはimgs = np.reshape(imgs, [np.shape(imgs)[0], -1])のようなコードを挿入しました。

投稿2020/12/11 00:09

kusegasugoi0221

総合スコア11

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問