Tensorflow Keras DNN和/或CNN回归中的误差传播

Tensorflow Keras DNN和/或CNN回归中的误差传播,tensorflow,neural-network,deep-learning,keras,conv-neural-network,Tensorflow,Neural Network,Deep Learning,Keras,Conv Neural Network,使用Keras和Tensorflow作为后端,我创建了一个CNN和DNN,用恒星光谱作为输入来预测三个恒星参数(温度、重力和金属丰度)。当应用于测试集时,这两个模型都能很好地预测,但为了使我的结果有用,有必要在我的预测中包含错误 输入光谱各有7000个数据点,输出为3个值。每个光谱还具有7000个数据点的误差阵列,我希望能够通过我的模型传播这些数据点,因此每个预测都有一组3个不确定性。有没有人对如何做到这一点有任何经验或见解 我的DNN结构如下所示: # Define vars activati

使用Keras和Tensorflow作为后端,我创建了一个CNN和DNN,用恒星光谱作为输入来预测三个恒星参数(温度、重力和金属丰度)。当应用于测试集时,这两个模型都能很好地预测,但为了使我的结果有用,有必要在我的预测中包含错误

输入光谱各有7000个数据点,输出为3个值。每个光谱还具有7000个数据点的误差阵列,我希望能够通过我的模型传播这些数据点,因此每个预测都有一组3个不确定性。有没有人对如何做到这一点有任何经验或见解

我的DNN结构如下所示:

# Define vars
activation = 'relu'
init = 'he_normal'
beta_1 = 0.9
beta_2 = 0.999
epsilon = 1e-08
input_shape = (None,7000)

epochs = 100
lr = 0.0009
batch_size = 64
n_hidden = [2048,1024,512,256,128]

# Design DNN Layers

model = Sequential([

    InputLayer(batch_input_shape=input_shape),

    Dense(n_hidden[0], init=init, activation=activation, bias=True),


    Dense(n_hidden[1], init=init, activation=activation, bias=True), 

    Dense(n_hidden[2], init=init, activation=activation, bias=True),

    Dense(n_hidden[3], init=init, activation=activation, bias=True),

    Dense(n_hidden[4], init=init, activation=activation, bias=True),

    Dense(l, init=init, activation='linear', bias=True),
])



# Optimization function
optimizer = Adam(lr=lr, beta_1=beta_1, beta_2=beta_2, epsilon=epsilon, decay=0.0)


# Compile and train network
model.compile(optimizer=optimizer, loss='mean_squared_error')

early_stopping = EarlyStopping(monitor='val_loss', min_delta=0.0001, 
                           patience=3, verbose=2, mode='min')


## train_X.shape = (50000,7000)
## train_Y.shape = (50000,3)
## cv_X.shape = (10000,7000)
## cv_Y.shape = (10000,3)

history = model.fit(train_X, train_Y, validation_data=(cv_X, cv_Y),
             nb_epoch=epochs, batch_size=batch_size, verbose=2, callbacks=[early_stopping])
我的CNN有点类似;基本上用1D-CNN层替换前几层,并修改过滤器数量和过滤器长度。关于如何通过模型传播错误的任何想法。我熟悉获取模型误差的一些方法(通过对同一模型和/或辍学层的多次培训),但我寻找的是实际预测中的误差

编辑

这是我的CNN的架构

# Define vars
input_shape = (None,7000,1)
epochs = 30
activation = 'relu'
initializer = 'he_normal'
beta_1 = 0.9
beta_2 = 0.999
epsilon = 1e-08
batch_size = 64


n_hidden = [1024,512,256]
n_filters = [16,32,32,64,64]
lr = 0.001




model = Sequential([
    InputLayer(batch_input_shape=input_shape),

    Convolution1D(nb_filter=n_filters[0], filter_length=8, activation=activation, border_mode='same', init=initializer, input_shape=input_shape),
    Convolution1D(nb_filter=n_filters[1], filter_length=8, activation=activation, border_mode='same', init=initializer), 
    MaxPooling1D(pool_length=4),

    Convolution1D(nb_filter=n_filters[2], filter_length=8, activation=activation, border_mode='same', init=initializer),
    Convolution1D(nb_filter=n_filters[3], filter_length=8, activation=activation, border_mode='same', init=initializer),
    MaxPooling1D(pool_length=4),

    Convolution1D(nb_filter=n_filters[4], filter_length=10, activation=activation),
    MaxPooling1D(pool_length=4),
    Flatten(),

    Dense(output_dim=n_hidden[0], activation=activation, init=initializer),
    Dense(output_dim=n_hidden[1], activation=activation, init=initializer),
    Dense(output_dim=n_hidden[2], activation=activation, init=initializer),

    Dense(output_dim=l, input_dim=n_hidden[2], activation='linear'),
])




# Compile Model
optimizer=Adam(lr=lr, beta_1=beta_1, beta_2=beta_2, epsilon=epsilon, decay=0.0)

model.compile(optimizer=optimizer, loss='mean_squared_error')

early_stopping = EarlyStopping(monitor='val_loss', min_delta=0.0001, 
                           patience=3, verbose=2, mode='min')

history = model.fit(train_X, train_Y, validation_data=(cv_X, cv_Y),
                nb_epoch=epochs, batch_size=batch_size, verbose=2, callbacks=[early_stopping])

所以我知道你想要预测不确定性。你有这些不确定性的训练数据吗?是的,每个由7000个数据点组成的光谱也有一个由7000个数据点组成的误差光谱。目前我已经训练了一个50000光谱的模型,但没有考虑误差光谱。到目前为止,该模型训练得非常好,但为了使结果在科学上有用,我需要通过该模型传播误差谱,并得到3个与3个预测值相对应的结果误差值。有什么想法吗?7000个数据点的误差谱描述了输入端的误差/不确定性,而您希望预测3个输出参数的不确定性。所以,我问你是否有任何数据描述误差谱如何影响输出参数。简而言之,您还需要一些关于这3个参数的不确定性的数据。从你所描述的到现在,我认为你没有。谢谢你的回复。如果你问的是这个问题,那么每个频谱的3个目标参数也有误差。你可以建立一个暹罗网络,它有两个通道,它们的权重是共享的。每个频道都可以遵循与CNN/DNN相同的架构。一个通道将获取输入谱并预测输出参数,另一个通道将获取输入误差谱并预测输出误差。有关如何构建暹罗网络的更多信息,请参阅。