2

Kerasを使用してRNNを構築しました。 RNNは、回帰問題を解決するために使用されます。Keras RNNの損失がエポックで減少しない

def RNN_keras(feat_num, timestep_num=100): 
    model = Sequential() 
    model.add(BatchNormalization(input_shape=(timestep_num, feat_num))) 
    model.add(LSTM(input_shape=(timestep_num, feat_num), output_dim=512, activation='relu', return_sequences=True)) 
    model.add(BatchNormalization()) 
    model.add(LSTM(output_dim=128, activation='relu', return_sequences=True)) 
    model.add(BatchNormalization()) 
    model.add(TimeDistributed(Dense(output_dim=1, activation='relu'))) # sequence labeling 

    rmsprop = RMSprop(lr=0.00001, rho=0.9, epsilon=1e-08) 
    model.compile(loss='mean_squared_error', 
        optimizer=rmsprop, 
        metrics=['mean_squared_error']) 
    return model 

すべてのプロセスは正常です。しかし、損失はエポックにまったく同じままです。

61267 in the training set 
6808 in the test set 

Building training input vectors ... 
888 unique feature names 
The length of each vector will be 888 
Using TensorFlow backend. 

Build model... 

# Each batch has 1280 examples 
# The training data are shuffled at the beginning of each epoch. 

****** Iterating over each batch of the training data ****** 
Epoch 1/3 : Batch 1/48 | loss = 11011073.000000 | root_mean_squared_error = 3318.232910 
Epoch 1/3 : Batch 2/48 | loss = 620.271667 | root_mean_squared_error = 24.904161 
Epoch 1/3 : Batch 3/48 | loss = 620.068665 | root_mean_squared_error = 24.900017 
...... 
Epoch 1/3 : Batch 47/48 | loss = 618.046448 | root_mean_squared_error = 24.859678 
Epoch 1/3 : Batch 48/48 | loss = 652.977051 | root_mean_squared_error = 25.552946 
****** Epoch 1: RMSD(training) = 24.897174 

Epoch 2/3 : Batch 1/48 | loss = 607.372620 | root_mean_squared_error = 24.644049 
Epoch 2/3 : Batch 2/48 | loss = 599.667786 | root_mean_squared_error = 24.487448 
Epoch 2/3 : Batch 3/48 | loss = 621.368103 | root_mean_squared_error = 24.926300 
...... 
Epoch 2/3 : Batch 47/48 | loss = 620.133667 | root_mean_squared_error = 24.901398 
Epoch 2/3 : Batch 48/48 | loss = 639.971924 | root_mean_squared_error = 25.297264 
****** Epoch 2: RMSD(training) = 24.897174 

Epoch 3/3 : Batch 1/48 | loss = 651.519836 | root_mean_squared_error = 25.523636 
Epoch 3/3 : Batch 2/48 | loss = 673.582581 | root_mean_squared_error = 25.952084 
Epoch 3/3 : Batch 3/48 | loss = 613.930054 | root_mean_squared_error = 24.776562 
...... 
Epoch 3/3 : Batch 47/48 | loss = 624.460327 | root_mean_squared_error = 24.988203 
Epoch 3/3 : Batch 48/48 | loss = 629.544250 | root_mean_squared_error = 25.090448 
****** Epoch 3: RMSD(training) = 24.897174 

私はそれが正常ではないと思います。私は何かが恋しいですか?


UPDATE: 私は、すべての予測は常にすべてのエポックの後にゼロであることを見つけます。これは、すべてのRMSDがすべて同じである、つまり0であるため、すべてのRMSDがすべて同じ理由です。つまり、トレーニングyを確認しました。わずか数個のゼロしか含まれていません。したがって、データの不均衡によるものではありません。

だから私が使用しているレイヤーと活性化のためだと思っています。

答えて

0

あなたのRNN機能は正常であるようです。

損失の減少の速度は、オプティマイザと学習率によって異なります。

どのように減衰率0.9を使用していますか。より大きな学習率で試してみてください。0.9倍の速度でどのように減少するのかを教えてください。

がkerasで利用可能な その他オプティマイザ異なる学習速度を持つ他のオプティマイザ試してみてください:いくつかの月に障害が発生している間https://keras.io/optimizers/

多くの時間を、いくつかのオプティマイザは、いくつかのデータセットに適しています。

1

活性化機能をreluからsoftmaxに変更しようとしましたか?

Relu活性化は発散する傾向がある。しかし、固有値行列を用いて重みを初期化すると、収束性が向上する可能性があります。

0

回帰問題(分類ではない)にRNNを使用しているので、最後の層で「線形」活性化を使用する必要があります。あなたのコードで

activation='linear'代わりの'relu'

model.add(TimeDistributed(Dense(output_dim=1, activation='relu'))) # sequence labeling 

変更。

動作しない場合は、2番目のレイヤーでactivation='relu'を削除してください。

rmspropの学習率も通常0.1〜0.0001です。

関連する問題