Функция потерь MSE Keras показывает другой выход, чем метрика MSE Tensorflow? - PullRequest
0 голосов
/ 13 мая 2019

Я тренирую сверточную сеть с непрерывным выводом на последнем слое. Последний слой имеет 4 узла. Я использую среднеквадратичную ошибку как функцию потерь. В качестве проверки я использовал среднеквадратичную ошибку от Tensorflow. Это дало только те же результаты для первой партии первой эпохи. Поэтому мой вопрос: почему они отличаются? Я использовал сверточные слои с максимальным пулом, и в конце я сплющил его и использовал dropout

Кроме того, мне также было интересно, как рассчитывается средняя квадратическая ошибка для 4 узлов? Это просто суммирование среднего квадрата ошибки каждого узла? Причина, по которой я вычисляю среднеквадратичную ошибку для узла, нет четкой связи.

Это метрика.

def loss(y_true, y_pred):
    loss = tf.metrics.mean_squared_error(y_true, y_pred)[1]
    K.get_session().run(tf.local_variables_initializer())
    return loss

И вот я компилирую модель

model.compile(loss='mse', optimizer= adam, metrics=[loss, node])

Вот как я рассчитал среднеквадратическую ошибку для одного узла:

def node(y_true, y_pred):
    loss = tf.metrics.mean_squared_error(y_true[:,0], y_pred[:,0])[1]
    K.get_session().run(tf.local_variables_initializer())
    return node

А это упрощенная форма модели:

    width = height = 128
    model = Sequential()

    model.add(Convolution2D(filters=64, kernel_size=(5, 5), activation='relu', padding='same',
                            input_shape=(width, height, 1)))
     model.add(MaxPooling2D(pool_size=(3, 3)))
    model.add(Flatten())
    model.add(Dense(units=256, activation='relu'))
    model.add(Dropout(0.4))
    model.add(Dense(units=4, activation='linear'))

    adam = Adam(lr=0.01, beta_1=0.9, beta_2=0.999, epsilon=None, decay=0) 
    model.compile(loss='mse', optimizer= adam, metrics=[loss,node])
...