Python 3.x 为什么Deep Ensembling不能在Tensorflow2中使用我的代码?
深度融合是一种获得不确定性估计的技术,它通过多次训练同一模型(每次都使用不同的随机初始化),然后使用同一模型的不同版本进行预测。本文介绍了这种方法: 我正试图用一个玩具问题和人工数据把这个想法付诸实践。我得到的反馈是,就集成捕获数据中不确定性的能力而言,性能非常差。我可能做错了什么 这是我的密码:Python 3.x 为什么Deep Ensembling不能在Tensorflow2中使用我的代码?,python-3.x,tensorflow2.0,keras-2,dropout,Python 3.x,Tensorflow2.0,Keras 2,Dropout,深度融合是一种获得不确定性估计的技术,它通过多次训练同一模型(每次都使用不同的随机初始化),然后使用同一模型的不同版本进行预测。本文介绍了这种方法: 我正试图用一个玩具问题和人工数据把这个想法付诸实践。我得到的反馈是,就集成捕获数据中不确定性的能力而言,性能非常差。我可能做错了什么 这是我的密码: # Create and plot 5000 data points x = np.linspace(-1, 2, 5000)[:, np.newaxis] y = np.power(x, 3)
# Create and plot 5000 data points
x = np.linspace(-1, 2, 5000)[:, np.newaxis]
y = np.power(x, 3) + 0.1*(2 + x)*np.random.randn(5000)[:, np.newaxis]
plt.scatter(x, y, alpha=0.1)
plt.show()
x_train = x[: 4000, :]
x_test = x[4000 :, :]
y_train = y[: 4000, :]
y_test = y[4000 :, :]
dense1 = 2**9
dense2 = 2**8
dense3 = 2**7
dropout1 = 0.2
dropout2 = 0.2
dropout3 = 0.5
import random
models = []
for i in tqdm(range(100)):
random.seed(i)
seed = np.random.randint(1, 1000)
x_in = Input(shape = (1, ))
x = Dense(dense1, activation = 'relu', kernel_initializer = tf.keras.initializers.GlorotNormal(seed= seed))(x_in)
x = Dropout(dropout1, seed = seed + 1)(x)
x = Dense(dense2, activation = 'relu', kernel_initializer = tf.keras.initializers.GlorotNormal(seed= seed + 2))(x)
x = Dropout(dropout2, seed = seed + 3)(x)
x = Dense(dense3, activation = 'relu', kernel_initializer = tf.keras.initializers.GlorotNormal(seed= seed + 4))(x)
x = Dropout(dropout3, seed = seed + 5)(x)
y_out = Dense(1, kernel_initializer = tf.keras.initializers.GlorotNormal(seed= seed + 6))(x)
model = Model(inputs = x_in, outputs = y_out)
callback = tf.keras.callbacks.EarlyStopping(
monitor="val_loss",
patience= 7,
restore_best_weights=False,
)
model.compile(
loss = tf.keras.losses.MeanSquaredError(),
optimizer= tf.keras.optimizers.Adam(),
metrics=[tf.keras.metrics.MeanAbsolutePercentageError()]
)
model.fit(x_train, y_train, validation_split = 0.2, callbacks = [callback], epochs = 1000, verbose = 0 )
models.append(model)
preds_train = []
preds_test = []
for model in tqdm(models):
for i in range(100):
pred_train = model.predict(x_train)
pred_test = model.predict(x_test)
preds_train.append(pred_train)
preds_test.append(pred_test)
preds_train = np.hstack(preds_train)
preds_test = np.hstack(preds_test)
train_q50 = pd.DataFrame(preds_train).quantile(0.5, axis = 1)
train_q95 = pd.DataFrame(preds_train).quantile(0.95, axis = 1)
train_q05 = pd.DataFrame(preds_train).quantile(0.05, axis = 1)
train_q99 = pd.DataFrame(preds_train).quantile(0.99, axis = 1)
train_q01 = pd.DataFrame(preds_train).quantile(0.01, axis = 1)
train_q995 = pd.DataFrame(preds_train).quantile(0.995, axis = 1)
train_q005 = pd.DataFrame(preds_train).quantile(0.005, axis = 1)
fig, ax = plt.subplots()
ax.scatter(x_train, y_train, color = 'blue', alpha = 0.1)
ax.plot(x_train, train_q50.values, color = 'red', lw = 3)
ax.plot(x_train, train_q95.values, color = '#014636', lw = 3)
ax.plot(x_train, train_q05.values, color = '#081d58', lw = 3)
ax.plot(x_train, train_q99.values, color = '#800026', lw = 3)
ax.plot(x_train, train_q01.values, color = '#993404', lw = 3)
ax.plot(x_train, train_q995.values, color = '#a50f15', lw = 3)
ax.plot(x_train, train_q005.values, color = '#016c59', lw = 3)
plt.show()