例如,在预测人群的智商时,你会期望平均值为 100。如果你在最后一层初始化偏差,你基本上是在给网络一个先机,告诉它应该在什么范围内猜测值。解决这个问题的另一种方法是预测一个均值为 0 的缩放结果值,这将使标准偏差初始化器值 0 准确无误。
对于这种情况,是否有任何指导规则/规范?两种方法都合适吗?
例如,在预测人群的智商时,你会期望平均值为 100。如果你在最后一层初始化偏差,你基本上是在给网络一个先机,告诉它应该在什么范围内猜测值。解决这个问题的另一种方法是预测一个均值为 0 的缩放结果值,这将使标准偏差初始化器值 0 准确无误。
对于这种情况,是否有任何指导规则/规范?两种方法都合适吗?
好主意!看起来真的很有帮助。
训练以较小的误差开始,因此您可以使用此技巧在更短的时间内训练模型。只要您正确初始化权重,您应该没问题。
我训练了具有不同偏差的模型,并在训练开始和结束时绘制了误差。数据的预期平均值为 100。请参见下面的代码。
from keras.models import Sequential
from keras.layers import Dense
from keras.initializers import Constant, Zeros, Ones
from keras.metrics import mean_squared_error
import matplotlib.pyplot as plt
import numpy as np
def getData():
n = 200
X = np.random.randn(n, 2)
Y = 20 * X[:,0] + 10 * X[:,1] + 100
return X, Y
def getModel(bias):
m = Sequential()
m.add(Dense(1,
input_shape=(2,),
bias_initializer=bias))
m.compile('adam', loss='mse')
return m
X, Y = getData()
constants = [0, 1, 10, 50, 100, 150, 200]
loss_at_start = []
loss_at_end = []
for c in constants:
m = getModel(Constant(c))
m.fit(X,Y,
epochs=20,
validation_split=0.2,
validation_steps=20,
steps_per_epoch=1000)
loss_at_start.append(m.history.history['loss'][0])
loss_at_end.append(m.history.history['loss'][-1])
plt.plot(constants, loss_at_start)
plt.plot(constants, loss_at_end)
plt.xlabel('Bias')
plt.ylabel('Loss')
plt.legend(['Loss at training start','Loss at training end'])
plt.title('Expected mean: 100')
plt.show()