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)
とエラーが出ました。
これは配列の縦と横のサイズが合っていないという事でしょうか?
どこをどう直せば良いのでしょうか?
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。