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

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

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

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

Q&A

解決済

1回答

2947閲覧

値がおかしい?MNISTデータセットを多層パーセプトロン(MLP)で学習

TakuroYamashiki

総合スコア15

Python 3.x

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

0グッド

0クリップ

投稿2017/07/25 07:03

###質問内容
結果の値がおかしいと思われるが、コードのどの部分がおかしいかわからない。

###条件
homework関数内のみで作成
MLPの作成にTensorflowなどのライブラリを使わない
出力yはone-of-k表現
最終層の活性化関数はソフトマックス関数, 誤差関数は多クラス交差エントロピー
###コード

lang

1def homework(train_X, train_y, test_X): 2 def sigmoid(x): 3 return 1/(1+np.exp(-x)) 4 def deriv_sigmoid(x): 5 return sigmoid(x) *(1-sigmoid(x)) 6 def softmax(x): 7 exp_x = np.exp(x) 8 return exp_x/np.sum(exp_x, keepdims=True) 9 def deriv_softmax(x): 10 return softmax(x)*(1 - softmax(x)) 11 12 np.random.seed(0) 13 # Layer1 weights 14 W1 = np.random.uniform(low=-0.08, high=0.08, size=(train_X.shape[1],100)).astype('float32') 15 b1 = np.zeros(100).astype('float32') 16 17 # Layer2 weights 18 W2 = np.random.uniform(low=-0.08, high=0.08, size=(100, 10)).astype('float32') 19 b2 = np.zeros(10).astype('float32') 20 eps=0.1 21 epochs=10 22 for loop in range(epochs): 23 train_X, valid_X, train_y, valid_y = train_test_split(train_X, train_y, 24 test_size=0.2, 25 random_state=42) 26 27 28 for X,Y in zip(train_X,train_y): 29 x=X[np.newaxis,:] 30 31 t=np.zeros(10) 32 t[Y]=1 33 34 u1 = np.matmul(x, W1) + b1 35 z= sigmoid(u1) 36 37 38 u2 = np.matmul(z, W2) + b2 39 y = softmax(u2) 40 41 42 43 delta_2 = y - t 44 delta_1 = deriv_sigmoid(u1) * np.matmul(delta_2, W2.T) 45 46 47 W1 = W1 - eps*np.matmul(x.T, delta_1) 48 b1 = b1 - eps*np.matmul(np.ones(len(x)), delta_1) 49 50 51 W2 = W2 - eps*np.matmul(z.T, delta_2) 52 b2 = b2 - eps*np.matmul(np.ones(len(z)), delta_2) 53 54 pred_y=np.array([]) 55 for X in test_X: 56 x=X[np.newaxis,:] 57 58 u1=np.matmul(x,W1)+b1 59 z=sigmoid(u1) 60 61 u2=np.matmul(z,W2)+b2 62 y=softmax(u2) 63 pred_y=np.append(pred_y,np.argmax(y)) 64 return pred_y 65 66from sklearn.utils import shuffle 67from sklearn.metrics import f1_score 68from sklearn.datasets import fetch_mldata 69from sklearn.model_selection import train_test_split 70 71import numpy as np 72 73def load_mnist(): 74 mnist = fetch_mldata('MNIST original') 75 mnist_X, mnist_y = shuffle(mnist.data.astype('float32'), 76 mnist.target.astype('int32'), random_state=42) 77 78 mnist_X = mnist_X / 255.0 79 80 return train_test_split(mnist_X, mnist_y, 81 test_size=0.2, 82 random_state=42) 83 84def validate_homework(): 85 train_X, test_X, train_y, test_y = load_mnist() 86 87 # validate for small dataset 88 train_X_mini = train_X[:100] 89 train_y_mini = train_y[:100] 90 test_X_mini = test_X[:100] 91 test_y_mini = test_y[:100] 92 93 pred_y = homework(train_X_mini, train_y_mini, test_X_mini) 94 print(f1_score(test_y_mini, pred_y, average='macro')) 95 96 97validate_homework() 98

###結果
0.250834015397

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

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

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

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

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

guest

回答1

0

ベストアンサー

1000 epoch にしてから、# validate for small datasetとしているところを全データセットにしたら97.2%になりました。

単純に学習データが足りないのだと思います。

0.972407732368

投稿2017/07/25 13:17

MasashiKimura

総合スコア1150

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

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

TakuroYamashiki

2017/07/25 13:20

ありがとうございます。 アンダーフィッティングのこと忘れていました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問