Я использую кераты с 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?