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

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

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

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

深層学習

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

CNN (Convolutional Neural Network)

CNN (Convolutional Neural Network)は、全結合層のみではなく畳み込み層とプーリング層で構成されるニューラルネットワークです。画像認識において優れた性能を持ち、畳み込みニューラルネットワークとも呼ばれています。

Q&A

解決済

2回答

3283閲覧

CNNとLSTMを組み合わせたモデルを作っているのですが、テストデータだと全く予測できていません。

ryoya0127

総合スコア1

Keras

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

深層学習

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

CNN (Convolutional Neural Network)

CNN (Convolutional Neural Network)は、全結合層のみではなく畳み込み層とプーリング層で構成されるニューラルネットワークです。画像認識において優れた性能を持ち、畳み込みニューラルネットワークとも呼ばれています。

0グッド

0クリップ

投稿2020/11/16 03:11

将来的にCNNとRNNを組み合わせたモデルを作成したく、mnistを使ってサンプルを作っているのですが、学習データの精度はほぼ1に近い値になりますが、テストデータの方は全くです(R^2が負の値だったり....)。
こちらのページを参考にコードを書いております。リンク内容
Kerasで書き換えているためモデルの構造と実行の部分は異なりますが、サンプルデータの作り方は全く同じものですので、こちらを見て頂ければと思います。
精度が低いとかそういう値ではないので何かモデルの構造がおかしいのではないかと思い、色々と試してみましたが、全く変わる様子はありません。
機械学習は初心者なもので意味不明なことをしているかもしれませんが、何卒よろしくお願い致します。

model

1def CNN_LSTM_Model(sequence_size, img_num, img_size, hidden_size): 2 3#cnn 4 input = Input(shape=(sequence_size, img_size, img_size, 1)) 5 6 cnn_list =[] 7 for i in range(sequence_size): 8 x = Conv2D(16, kernel_size=(3, 3), strides=(1, 1), padding='same', activation='elu')(input[:,i,:,:,:]) 9 x = MaxPooling2D(pool_size=(2, 2), strides=(2, 2))(x) 10 x = Dropout(0.3)(x) 11 x = Conv2D(16, kernel_size=(3, 3), strides=(1, 1), padding='same', activation='elu')(x) 12 x = MaxPooling2D(pool_size=(2, 2), strides=(2, 2))(x) 13 x = Dropout(0.3)(x) 14 x = Flatten()(x) 15 output1 = Dense(hidden_size, activation='elu',kernel_initializer=tf.keras.initializers.VarianceScaling())(x) 16 cnn_list.append(output1) 17 18 cnn_list=tf.transpose(cnn_list,perm=[1,0,2]) 19 #cnn_list = tf.reshape(cnn_list,(img_num,sequence_size,hidden_size)) 20#LSTM 21 x = LSTM(hidden_size, stateful=False)(cnn_list) 22 output2 =Dense(19,activation='softmax')(x) 23 24 model = Model(inputs=input, outputs=output2) 25 model.compile(loss="categorical_crossentropy", optimizer="Adam",metrics=['accuracy']) 26 27 model.summary() 28 29 return model

run

1img_num=128 2sequence_size=2 3img_size=28 4output_size=19 5hidden_size=256 6 7(x_train, y_train), (x_test, y_test) = mnist.load_data() 8x_T, y_T, y_T_onehot = sampling_data(x_train, y_train) 9 10y_T_onehot = np.reshape(y_T_onehot,(img_num,output_size)) 11 12#for fitting first dimension size 13x_T = np.reshape(x_T,(sequence_size,img_num,img_size,img_size,1)) 14x_T = np.transpose(x_T,(1,0,2,3,4)) 15 16model = CNN_LSTM_Model(sequence_size=sequence_size, img_num=img_num, img_size=img_size, hidden_size=hidden_size) 17model.fit(x_T,y_T_onehot,batch_size=img_num,epochs=500,verbose=1,validation_split=0.0)

predict

1x_T_test, y_T_test, y_T_onehot_test = sampling_data(x_test, y_test) 2y_T_onehot_test = np.reshape(y_T_onehot_test,(img_num,output_size)) 3x_T_test = np.transpose(x_T_test,(1,0,2,3,4)) 4 5pred_train = model.predict(x_T,batch_size=img_num,verbose=0) 6pred_test = model.predict(x_T_test,batch_size=img_num, verbose=0) 7 8train_ans = [] 9for i in range(img_num): 10 max_index = np.argmax(pred_train[i]) 11 ans = max_index -9 12 train_ans.append(ans) 13 14test_ans = [] 15for i in range(img_num): 16 max_index = np.argmax(pred_test[i]) 17 ans = max_index -9 18 test_ans.append(ans) 19 20print("RMSE: %.0f" % (np.sqrt(mean_squared_error(y_T, train_ans)))) 21print("R2: %.3f" % (r2_score(y_T, train_ans))) 22print("RMSE: %.0f" % (np.sqrt(mean_squared_error(y_T_test, test_ans)))) 23print("R2: %.3f" % (r2_score(y_T_test, test_ans))) 24#RMSE: 0 25#R2: 1.000 26#RMSE: 4 27#R2: 0.054

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

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

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

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

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

meg_

2020/11/16 11:08

訓練データとバリデーションデータでloss・accuracyの差はどうなっていますか?
ryoya0127

2020/11/17 03:15

参考までに500エポック目の値です。 loss: 0.1808 - accuracy: 0.1875 - val_loss: 0.2045 - val_accuracy: 0.07 どうもHistoryを参照できないみたいで、loss や accuracy をplotすることもできなくて図をお見せできません。 'History' object has no attribute 'keys' というエラーが出てしまうのですがこれも関係ありますかね?
meg_

2020/11/17 05:03

訓練データとバリデーションデータの差はないということでしょうか。学習過程が可視化できないのであれば何とも言えませんが、過学習を疑ったのですが違うのかもしれませんね。
ryoya0127

2020/11/17 13:05

すみません昨日の値間違っておりました、500エポックですと loss: 0.0011 - accuracy: 1.0000 - val_loss: 0.4716 - val_accuracy: 0.2031 これだと過学習ぽく見えますが、こういう値をとるときもあれば、現実的ではない値をとることもあるのでよくわからないですね...
guest

回答2

0

自己解決

ちゃんと1からサンプルコードを見直せばよかったのですが、
tensorflowは全くわからないので、実行のとこらへんを雑に見ていました。。。
kerasだと多分できない?ですがサンプルでは毎エポックでデータを入れ替えていました(データを取得する関数を毎回実行)
つまり、1万エポックで毎回バッチ数は128だから、1280000×2枚の画像を使っていたわけで、
対するぼくはそんなこと知らず、128×2枚の画像しか使っていなかったわけで、そりゃあ過学習起こしますよと...
kerasのmodel.fitだとそんなことできなそうなので、とりあえず1回の画像の枚数を10000とかにしたら全然8割ぐらいの精度出ました...こんなことに3週間ぐらい気づかなかったなんて...

まあ、関係はしてなかったですが色々試行錯誤する過程で勉強になったのでよしとしましょう...

回答くださった方ありがとうございました!!

投稿2020/11/24 11:00

ryoya0127

総合スコア1

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

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

0

Kerasは普段使いませんし直感で回答します.

まずtrainで精度が1近いのでモデルの不備を除外します.

trainとtestで差が大きいのでコードの差分を確認します.

trainとtestで異なる部分があります.

python

1x_T = np.reshape(x_T,(sequence_size,img_num,img_size,img_size,1)) 2x_T = np.transpose(x_T,(1,0,2,3,4))

python

1x_T_test = np.transpose(x_T_test,(1,0,2,3,4))

np.reshapeの変形が抜けてませんか?

投稿2020/11/16 03:24

unknown_user

総合スコア68

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

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

ryoya0127

2020/11/16 03:55

ややこしいことをして申し訳ありません。 ここのreshapeは無くても結果は変わらなかったので、testの方では消していたのですが、trainの方では消し忘れていました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問