将来的に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
回答2件
あなたの回答
tips
プレビュー