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

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

ただいまの
回答率

90.36%

  • Python 3.x

    8501questions

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

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

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,012

質問内容

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

条件

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

コード

def homework(train_X, train_y, test_X):
    def sigmoid(x):
        return 1/(1+np.exp(-x))
    def deriv_sigmoid(x):
        return sigmoid(x) *(1-sigmoid(x))
    def softmax(x):
        exp_x = np.exp(x)
        return exp_x/np.sum(exp_x, keepdims=True)
    def deriv_softmax(x):
        return softmax(x)*(1 - softmax(x))

    np.random.seed(0)
    # Layer1 weights
    W1 = np.random.uniform(low=-0.08, high=0.08, size=(train_X.shape[1],100)).astype('float32')
    b1 = np.zeros(100).astype('float32')

    # Layer2 weights
    W2 = np.random.uniform(low=-0.08, high=0.08, size=(100, 10)).astype('float32')
    b2 = np.zeros(10).astype('float32')
    eps=0.1
    epochs=10
    for loop in range(epochs):
        train_X, valid_X, train_y, valid_y = train_test_split(train_X, train_y,
                                                              test_size=0.2,
                                                              random_state=42)


        for X,Y in zip(train_X,train_y):
            x=X[np.newaxis,:]

            t=np.zeros(10)
            t[Y]=1

            u1 = np.matmul(x, W1) + b1
            z= sigmoid(u1)


            u2 = np.matmul(z, W2) + b2
            y = softmax(u2)



            delta_2 = y - t 
            delta_1 = deriv_sigmoid(u1) * np.matmul(delta_2, W2.T) 


            W1 = W1 - eps*np.matmul(x.T, delta_1)
            b1 = b1 - eps*np.matmul(np.ones(len(x)), delta_1)


            W2 = W2 - eps*np.matmul(z.T, delta_2)
            b2 = b2 - eps*np.matmul(np.ones(len(z)), delta_2)

    pred_y=np.array([])
    for X in test_X:
        x=X[np.newaxis,:]

        u1=np.matmul(x,W1)+b1
        z=sigmoid(u1)

        u2=np.matmul(z,W2)+b2
        y=softmax(u2)
        pred_y=np.append(pred_y,np.argmax(y))
    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_homework():
    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 = homework(train_X_mini, train_y_mini, test_X_mini)
    print(f1_score(test_y_mini, pred_y, average='macro'))


validate_homework()

結果

0.250834015397

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

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

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

0.972407732368

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/07/25 22:20

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

    キャンセル

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

  • ただいまの回答率 90.36%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Python 3.x

    8501questions

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