результат обучения находится вне допустимого диапазона при использовании CNN с LSTM - PullRequest
0 голосов
/ 01 февраля 2019

Я использую кераты с tf в качестве бэкэнда.

Цель симуляции - попытаться использовать набор данных геопространственных временных рядов для построения классификатора.Цель Y помечена как -1, 0, 1 и 2, где -1 указывает измеренные данные в этой точке сетки, 0 означает данные хорошего качества, 1 - среднее качество, 2 - худшее.

Прямо сейчас у меня есть два входа.У меня есть некоторые атмосферные переменные поверхности, такие как ветер, скорость ветра и дождь в качестве одного входа.И переменные поверхности океана, такие как температура поверхности моря и соленость поверхности моря в качестве второго входа.Размеры всех наборов данных должны быть, например, (n_samples, n_timesteps, n_variables, n_xpoints: longitude, n_ypoints: latitude).Целевой набор данных находится в трехмерных измерениях, например: (n_samples, n_xpoints: longitude, n_ypoints: latitude).

Кроме того, все входные переменные нормализуются по диапазону значений.Например, скорость течения на поверхности моря нормализуется в ярости (-1,1) от (-2, 2) [м / с], а скорость приземного ветра нормализуется в ярости (-1,1)от (-20,20) [м / с].

Конфигурация модели разработана так, как описано ниже.

def cnn():
   model = Sequential()
   model.add( Conv2D(64, (3,3), activation='relu',
           data_format='channels_first', kernel_initializer='he_normal',
           name='conv1') )
   model.add( MaxPooling2D(pool_size=(2, 2), strides = (2,2)))
   model.add( BatchNormalization() )

   model.add( Conv2D(32, (3,3), activation='relu',
           kernel_initializer='he_normal', data_format='channels_first',
           name='conv2') )
   model.add( MaxPooling2D(pool_size=(2, 2), strides = (2,2)))
   model.add( Dropout(0.2) )
   model.add( BatchNormalization() )
   model.add( Activation('relu') )

   model.add( MaxPooling2D(pool_size=(2, 2), strides = (2,2)))
   model.add( Flatten() )
   model.add( Dense(128,activation='relu') )
   return model

def cnn2lstm(Input_shape, premo, name):
   branch_in = Input(shape=Input_shape, dtype='float32')
   model = TimeDistributed(premo)(branch_in)
   model = LSTM(256, return_sequences=True, name=name+'_lstm1')(model)
   model = TimeDistributed(Dense(4096, activation='relu'))(model)
   model = TimeDistributed(Dropout(0.3))(model)
   model = LSTM(256, return_sequences = True, name=name+'_lstm2')(model)
   model = Dense(101, activation='sigmoid')(model)
   model = Dropout(0.3)(model)
   return branch_in, model

atm_in, atm = cnn2lstm(Train_atm.shape[1:], cnn(),'atm')
ocn_in, ocn = cnn2lstm(Train_ocn.shape[1:], cnn(),'ocn')

#--- two inputs into one output
x = keras.layers.concatenate([atm,ocn],axis=1)   
x = LSTM(150,return_sequences=True)(x) 
x = Dropout(0.2)(x) 
x = LSTM(200,return_sequences=True)(x) 
x = Dropout(0.2)(x) 
x = LSTM(500)(x) 
x = Dense(1001,activation='relu')(x)   
x = Dense(2001,activation='relu')(x)   
x = Dense(2501,activation='tanh')(x) 
x = Dense(2701,activation='relu')(x) 
x = Dense(3355,activation='softmax')(x) 
x = Reshape((61,55),input_shape=(3355,))(x) 
model2 = Model(inputs=[atm_in, ocn_in, bio_in], outputs=x) 
plot_model(model2, show_shapes = True, to_file='model_way4_2.png') 
model2.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy']) 

filepath='ways4_model02_best.hdf5'
checkpoint = ModelCheckpoint(filepath,monitor='val_acc', verbose=1,save_best_only=True,mode='max')
callbacks_list = [checkpoint]
hist = model2.fit([Train_atm, Train_ocn, Train_bio], Train_Y, 
                        epochs=150, batch_size=3, validation_split=0.1, 
                        shuffle=True, callbacks=callbacks_list, verbose=0)           

scores = model2.evaluate([Train_atm, Train_ocn, Train_bio], Train_Y)
print("MODEL 2 %s: %.2f%%" % (model2.metrics_names[1], scores[1]*100))

Оценочные баллы в данном случае в основном составляют 83% или выше.Но значение вывода model2.predict не дает мне допустимый диапазон, как мой целевой набор данных.Напротив, выходные данные модели дают мне значение от 0 до 1 (0,1) с аналогичным шаблоном, как показывает целевой набор данных.

Может ли кто-нибудь сказать какую-либо большую проблему, которую я имею в моем алгоритме DL?

...