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

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

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

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

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

Q&A

1回答

4696閲覧

ValueError: shapes (100,784) and (5,3) not aligned: 784 (dim 1) != 5 (dim 0)

退会済みユーザー

退会済みユーザー

総合スコア0

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

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

0グッド

0クリップ

投稿2017/05/19 14:39

編集2022/08/18 06:37

ValueError: shapes (100,784) and (5,3) not aligned: 784 (dim 1) != 5 (dim 0) とエラーが出ました。

Jupyterで

def xxx(train_X, train_y, test_X): """多層パーセプトロンを初期化 numInput 入力層のユニット数(バイアスユニットは除く) numHidden 隠れ層のユニット数(バイアスユニットは除く) numOutput 出力層のユニット数 act1 隠れ層の活性化関数(tanh or sigmoid) act2 出力層の活性化関数(tanh or sigmoid or identity) """ np.tanh(train_X) Z = 1 / (1 + np.exp(-train_X)) numHidden=5 numInput=3 numOutput=1 epochs=100 # 重みを (-1.0, 1.0)の一様乱数で初期化 # 入力層-隠れ層間 weight1 = np.random.uniform(-1.0, 1.0, (numHidden,numInput)) b1 = np.zeros(3).astype('float32') # 隠れ層-出力層間 weight2 = np.random.uniform(-1.0, 1.0, (numOutput,numHidden)) b2 = np.zeros(3).astype('float32') """訓練データを用いてネットワークの重みを更新する""" # 入力データの最初の列にバイアスユニットの入力1を追加 X = np.hstack([np.ones([train_X.shape[0], 1]), train_X]) t = np.array(X) # 逐次学習 # 訓練データからランダムサンプリングして重みを更新をepochs回繰り返す for k in range(epochs): # 訓練データからランダムに選択する i = np.random.randint(X.shape[0]) x = X[i] # 入力を順伝播させて中間層の出力を計算 z= np.matmul(train_X, weight1) + b1 z2 = 1 / (1 + np.exp(z)) # 中間層の出力を順伝播させて出力層の出力を計算 z3 = np.matmul(z2, weight2) + b2 z4 = 1 / (1 + np.exp(z3)) # 出力層の誤差を計算 # WARNING # PRMLによると出力層の活性化関数にどれを用いても # (y - t[i]) でよいと書いてあるが # 下のように出力層の活性化関数の微分もかけた方が精度がずっとよくなる delta2 = Z * (y - t[i]) # 出力層の誤差を逆伝播させて隠れ層の誤差を計算 delta1 = Z * np.dot(weight2.T, delta2) # 隠れ層の誤差を用いて隠れ層の重みを更新 # 行列演算になるので2次元ベクトルに変換する必要がある x = np.atleast_2d(x) delta1 = np.atleast_2d(delta1) weight1 -= learning_rate * np.dot(delta1.T, x) # 出力層の誤差を用いて出力層の重みを更新 z = np.atleast_2d(z) delta2 = np.atleast_2d(delta2) weight2 -= learning_rate * np.dot(delta2.T, x) """テストデータの出力を予測""" x = np.array(x) # バイアスの1を追加 x = np.insert(x, 0, 1) # 順伝播によりネットワークの出力を計算 z5 = np.matmul(train_X, weight1) pred_y = np.matmul(z5, weight1) return pred_y
from sklearn.utils import shuffle from sklearn.metrics import f1_score from sklearn.datasets import fetch_mldata from sklearn.model_selection import train_test_split import numpy as np def load_mnist(): mnist = fetch_mldata('MNIST original') mnist_X, mnist_y = shuffle(mnist.data.astype('float32'), mnist.target.astype('int32'), random_state=42) mnist_X = mnist_X / 255.0 return train_test_split(mnist_X, mnist_y, test_size=0.2, random_state=42) def validate_xxx(): train_X, test_X, train_y, test_y = load_mnist() # validate for small dataset train_X_mini = train_X[:100] train_y_mini = train_y[:100] test_X_mini = test_X[:100] test_y_mini = test_y[:100] pred_y = xxx(train_X_mini, train_y_mini, test_X_mini) print(f1_score(test_y_mini, pred_y, average='macro')) def score_xxx(): train_X, test_X, train_y, test_y = load_mnist() pred_y = xxx(train_X, train_y, test_X) print(f1_score(test_y, pred_y, average='macro'))
validate_xxx()

と書いたセルを上から順に実行すると

--------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-19-1b587794855b> in <module>() ----> 1 validate_xxx() <ipython-input-18-42c14f2656f1> in validate_homework() 26 test_y_mini = test_y[:100] 27 ---> 28 pred_y = xxx(train_X_mini, train_y_mini, test_X_mini) 29 print(f1_score(test_y_mini, pred_y, average='macro')) 30 <ipython-input-17-f64bb83219d7> in homework(train_X, train_y, test_X) 55 56 # 入力を順伝播させて中間層の出力を計算 ---> 57 z= np.matmul(train_X, weight1) + b1 58 z2 = 1 / (1 + np.exp(z)) 59 # 中間層の出力を順伝播させて出力層の出力を計算 ValueError: shapes (100,784) and (5,3) not aligned: 784 (dim 1) != 5 (dim 0)

とエラーが出ました。
これは配列の縦と横のサイズが合っていないという事でしょうか?
どこをどう直せば良いのでしょうか?

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

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

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

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

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

guest

回答1

0

私は今ニューラルネットワークを学習している学生で、Pythonも使い慣れていません。
また、このサイトで書き込みを行うという行為に関しても経験がありません。
そのため間違いや、重大なマナー違反をしているかもしれません。
何か問題があればご指摘してくださるとうれしいです。

まず、numInput=3とありますが、これはニューラルネットワークにおいて入力層のユニット数が3であることを示していると思われます。そのため、入力できるデータの個数は3個に限定されるのではないでしょうか。

もしそうであれば、関数 xxx の引数である train_X_mini は train_X[:100] ですので、100個の要素を持つリストだから、3個しかデータの入力ができないニューラルネットワークに100個のデータの入力を行おうとしていることになり、エラーを吐いたと考えられます。
(エラー内容は、入力と重みは1対1対応のはずだからそうなるように掛け算を行いたいが、データ数が異なるせいで値を求めることができない...と言ってるように見える)

numInput=100とすることで問題が解決すると考えましたが、間違っていたら申し訳ありません。
あるいは、プログラム内にランダムサンプリングを行うと書いてあるので、ランダムサンプリングで3個のデータを持ってきて、それらを関数に渡すことでエラーが回避できるのではないでしょうか。

またプログラムをみるとバイアスユニットを使っているように見えますが、バイアスユニットからの出力に対しても重みを掛けて総和をとるため、バイアスユニット用の重み変数を定義して、これも他の重みと同様に修正する必要があると思いました。これも保証はできないです。間違っていたらすみません。

投稿2022/08/17 21:37

llcn

総合スコア4

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問