質問: 100程度にしても多少上下しながら横ばいになります plt.plot(history.history['loss'], label ='loss') #予測_X_test[w]_wに0,1,2,3,4,5のどれを入れても結果は同じになります。 model.predict(X_test[0].reshape(1,-1)) #返り値は_array([[1.]], dtype=float32) ``` ### 試したこと ``` model.add(Dense(1)) model.add(Activation('softmax')) ``` としてしまっていたところを ``` model.add(Dense(1)) model.add(Activation('linear')) ``` と変更して出力がそのまま出てくるようにした ### 補足情報(FW/ツールのバージョンなど)
回答: ネットワークの構造に問題があります。 ネットワークの最後に ``` model.add(Dense(1)) model.add(Activation('softmax')) ``` とあります。 Dense(1)によって、データは(データ数, 1次元)に変換されます。 これに対し、ソフトマックス関数を適用するとすべて、1になって帰ってきます。 なぜなら、ソフトマックス関数はその特性から、データのすべての次元を足しあわせると1になるからです。 Denseによって1次元にされているので、1次元でかつ、合計1になるのは、出力1のみです。 さて、一般に測定値のような連続値を予測させる場合、最後の活性化関数にソフトマックス関数は採用しません。 たとえば、測定値の範囲が0~1であれば、シグモイド関数を使用しますし、-1~1であれば、ハイパボリックタンジェント関数(tanh)です。 一方、測定値が0以上の実数であれば、relu関数を使用できるでしょう。 また、たとえば、0~100の範囲に必ず収まるのであれば、シグモイド関数をかけて、さらに100を掛ける、などの方法があると思います。 測定値の範囲に応じて、最後の活性化関数を変更してみてください。