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

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

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

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

深層学習

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

Python 3.x

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

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Q&A

解決済

4回答

2523閲覧

CNNの比較、改善点

yukkys

総合スコア42

Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

深層学習

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

Python 3.x

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

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

0グッド

0クリップ

投稿2018/03/02 06:50

編集2018/03/03 05:24

知りたいこと

cyfer10に使用したCNNでなぜこのような差が出たのか、してはいけないことが含まれていたのか。
aidemyに使われていたCNNと層よりも、より層を増やして適当に作った自作CNNが明らかに精度が悪い。

学習結果

//モデル定義 model = Sequential() model.add(Conv2D(32, (3, 3), padding='same', input_shape=X_train.shape[1:])) model.add(Activation('relu')) model.add(Conv2D(32, (3, 3))) model.add(Activation('relu')) model.add(MaxPool2D(pool_size=(2, 2))) model.add(Dropout(0.5)) model.add(Conv2D(64, (3, 3), padding='same')) model.add(Activation('relu')) model.add(Conv2D(64, (3, 3))) model.add(Activation('relu')) model.add(MaxPool2D(pool_size=(2, 2))) model.add(Dropout(0.5)) model.add(Flatten()) model.add(Dense(512)) model.add(Activation('relu')) model.add(Dropout(0.5)) model.add(Dense(10)) model.add(Activation('softmax')) //コンパイル model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy']) //学習 fit = model.fit(X_train, Y_train, batch_size=32, epochs=50, verbose=1, validation_split=0.3 ) ![イメージ説明](a545e87427558a35e3f9374a0e1ddb4a.png)
//モデル定義 ori1 = Sequential() ori1.add(Conv2D(256, (3, 3), padding='same', input_shape=X_train.shape[1:])) ori1.add(Activation("relu")) ori1.add(Conv2D(256, (3, 3))) ori1.add(Dropout(0.5)) ori1.add(Activation("relu")) ori1.add(MaxPool2D(pool_size=(2, 2))) ori1.add(Dropout(0.5)) ori1.add(Conv2D(128, (3, 3))) ori1.add(Activation("relu")) ori1.add(Dropout(0.5)) ori1.add(Conv2D(128, (3, 3))) ori1.add(Activation("relu")) ori1.add(MaxPool2D(pool_size=(2, 2))) ori1.add(Dropout(0.5)) ori1.add(Conv2D(32, (3, 3))) ori1.add(Activation("relu")) ori1.add(Dropout(0.5)) ori1.add(Conv2D(32, (3, 3))) ori1.add(Activation("relu")) ori1.add(Flatten()) ori1.add(Dense(512)) ori1.add(Activation('relu')) ori1.add(Dropout(0.5)) ori1.add(Dense(256)) ori1.add(Activation('relu')) ori1.add(Dropout(0.5)) ori1.add(Dense(10)) ori1.add(Activation("softmax")) //コンパイル ori1.compile(optimizer="adam", loss="categorical_crossentropy", metrics=["accuracy"]) //学習 fit_ori1 = ori1.fit(X_train, Y_train, batch_size=32, epochs=50, verbose=1, validation_split=0.3 )

イメージ説明

ダメな部分

してはいけないこと、推奨されていないことをしてしまっている、このdropoutやmaxpoolingの位置や数字、層の順序やパラメータで明らかに間違っている等があれば教えていただきたいです。よろしくお願いします。

改善したCNN

ori2 = Sequential() ori2.add(Conv2D(32, (3, 3), padding='same', input_shape=X_train.shape[1:])) ori2.add(Activation("relu")) ori2.add(Conv2D(32, (3, 3))) ori2.add(Dropout(0.5)) ori2.add(Activation("relu")) ori2.add(MaxPool2D(pool_size=(2, 2))) ori2.add(Dropout(0.5)) ori2.add(Conv2D(32, (3, 3))) ori2.add(Activation("relu")) ori2.add(Dropout(0.5)) ori2.add(Conv2D(32, (3, 3))) ori2.add(Activation("relu")) ori2.add(MaxPool2D(pool_size=(2, 2))) ori2.add(Dropout(0.5)) ori2.add(Conv2D(32, (3, 3))) ori2.add(Activation("relu")) ori2.add(Dropout(0.5)) ori2.add(Conv2D(32, (3, 3))) ori2.add(Activation("relu")) ori2.add(Flatten()) ori2.add(Dense(512)) ori2.add(Activation('relu')) ori2.add(Dropout(0.5)) ori2.add(Dense(256)) ori2.add(Activation('relu')) ori2.add(Dropout(0.5)) ori2.add(Dense(10)) ori2.add(Activation("softmax"))

イメージ説明
Conv32固定だとダメな模様?

### ori3 Dropoutを徐々に増加、batch_sizeを大きめに100に変更 ori3 = Sequential() ori3.add(Conv2D(32, (3, 3), padding='same', input_shape=X_train.shape[1:])) ori3.add(Activation("relu")) ori3.add(Conv2D(32, (3, 3))) ori3.add(Dropout(0.1)) ori3.add(Activation("relu")) ori3.add(MaxPool2D(pool_size=(2, 2))) ori3.add(Dropout(0.1)) ori3.add(Conv2D(64, (3, 3))) ori3.add(Activation("relu")) ori3.add(Dropout(0.2)) ori3.add(Conv2D(64, (3, 3))) ori3.add(Activation("relu")) ori3.add(MaxPool2D(pool_size=(2, 2))) ori3.add(Dropout(0.2)) ori3.add(Conv2D(128, (3, 3))) ori3.add(Activation("relu")) ori3.add(Dropout(0.3)) ori3.add(Conv2D(128, (3, 3))) ori3.add(Activation("relu")) ori3.add(Flatten()) ori3.add(Dense(512)) ori3.add(Activation('relu')) ori3.add(Dropout(0.4)) ori3.add(Dense(256)) ori3.add(Activation('relu')) ori3.add(Dropout(0.5)) ori3.add(Dense(10)) ori3.add(Activation("softmax"))

イメージ説明
77%くらいまで上昇しました。90%とかそこまでは求めないとしても、80%とかどうやって出すんでしょう。

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

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

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

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

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

wakame

2018/03/02 15:41

上のリンクを参考にソースコードを``` ```で囲むようにしてください。
guest

回答4

0

ベストアンサー

いつも Aidemy をご利用いただきありがとうございます。Aidemy 技術顧問の木村です。

以下のように書き換えることで80%以上の精度を出すことができます。
ポイントは2点です。

  • 各層にBatchNormalization を用いる
  • FlattenのかわりにGlobalAveragePooling を用いる
import keras from keras.datasets import cifar10 from keras.layers import Conv2D, Activation, Dense, Dropout, MaxPooling2D from keras.layers.normalization import BatchNormalization from keras.models import Sequential, load_model from keras.layers.pooling import GlobalAveragePooling2D from keras.utils.np_utils import to_categorical import numpy as np import matplotlib.pyplot as plt # データのロード (X_train, y_train), (X_test, y_test) = cifar10.load_data() y_train = to_categorical(y_train) y_test = to_categorical(y_test) # モデルの定義 model = Sequential() model.add(Conv2D(64, (3, 3), padding='same', input_shape=X_train.shape[1:])) model.add(Activation('relu')) model.add(BatchNormalization()) model.add(Dropout(0.25)) model.add(Conv2D(64, (3, 3))) model.add(Activation('relu')) model.add(BatchNormalization()) model.add(Dropout(0.25)) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Conv2D(64, (3, 3), padding='same')) model.add(Activation('relu')) model.add(BatchNormalization()) model.add(Dropout(0.25)) model.add(Conv2D(64, (3, 3))) model.add(Activation('relu')) model.add(BatchNormalization()) model.add(Dropout(0.25)) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Conv2D(64, (3, 3))) model.add(Activation('relu')) model.add(BatchNormalization()) model.add(Dropout(0.25)) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(GlobalAveragePooling2D()) model.add(Dense(10)) model.add(Activation('softmax')) # コンパイル opt = keras.optimizers.rmsprop(lr=0.0001, decay=1e-6) model.compile(loss='categorical_crossentropy', optimizer=opt, metrics=['accuracy']) # 学習 model.fit(X_train, y_train, batch_size=32, epochs=50, validation_data=[X_test, y_test], shuffle=True) # 重みの保存をする場合には以下を使います。ここでは実行できません。 # model.save_weights('param_cifar10.hdf5') # 精度の評価 scores = model.evaluate(X_test, y_test, verbose=1) print('Test loss:', scores[0]) print('Test accuracy:', scores[1]) # データの可視化(テストデータの先頭の10枚) for i in range(10): plt.subplot(2, 5, i+1) plt.imshow(X_test[i]) plt.suptitle("テストデータの先頭の10枚",fontsize=20) plt.show() # 予測(テストデータの先頭の10枚) pred = np.argmax(model.predict(X_test[0:10]), axis=1) print(pred) model.summary()

BatchNormalization、GlobalAveragePooling についてはAidemyでまだ教えておりませんので、
以下を参考にしてください。今後、Aidemyの講座でも取り扱われる予定です。

以上です。今後ともAidemyをよろしくお願いいたします。

投稿2018/03/03 02:49

MasashiKimura

総合スコア1150

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

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

yukkys

2018/03/03 05:20

コメントありがとうございます!まさかのaidemyの顧問の方とは。。BatchNormalizationは学習速度上げるためのものだと思っていたんですが、精度向上にも役立つのですね。GlobalAveragePoolingは初耳で参考URLを読ませていただきました。こちらこそ、今後ともよろしくお願いいたします。
guest

0

(偏りの少ないデータに対して、)batch_sizeを小さくして、それにともなって学習率を下げると精度が上がったりします。

投稿2018/03/02 09:51

mkgrei

総合スコア8560

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

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

yukkys

2018/03/03 05:08

コメントありがとうございます!batch_sizeは大きい方が学習速度速いしいいんじゃないかと思ってたんですが、小さくして局所解を避けつつ最適解に近づくみたいなイメージでしょうか。
guest

0

精度上げたいなら訓練用のデータセットを増やすのが早いかなと思いました。

あとはWhat is the class of this image ?
こちらののリンクのcifar10上位のスコアを取っているモデルを参考にするとか?(リンク先のモデルを作れるなら精度をあげるという目的は解決できている気がしますが・・・)

投稿2018/03/02 09:14

編集2018/03/02 15:45
wakame

総合スコア1170

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

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

yukkys

2018/03/03 05:10

コメントありがとうございます!データの水増しですね。これも書籍で見てはいたもののやってはいなかったのでやってみます! そちらのリンクを少し見て、dropoutの数値を徐々に増やしていくみたいなの参考にさせてもらったりしました!あとは複数のモデル使うのが強いですね。
guest

0

カーネルサイズを32にするとどうでしょうか

投稿2018/03/02 06:56

EvanYou

総合スコア21

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

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

yukkys

2018/03/02 07:12

コメントありがとうございます!早速サイズを32にして学習させています。カーネルサイズについて誤解していたことがあったようで、畳み込むから大きいサイズから小さいサイズに変更するようなイメージでいました。新しいCNNは追記しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問