我正在研究来自https://machinelearningmastery.com/tutorial-first-neural-network-python-keras/的非常基础的神经网络。我用一组随机数字和随机标签替换了原本使用的数据。
我假设由于输入是随机的,预测值应该在0.50左右,稍微上下浮动。然而,当我这样做时,我得到的预测结果是
[0.49525392, 0.49652839, 0.49729034, 0.49670222, 0.49342978, 0.49490061, 0.49570397, 0.4962129, 0.49774086, 0.49475089, 0.4958384, 0.49506786, 0.49696651, 0.49869373, 0.49537542, 0.49613148, 0.49636957, 0.49723724]
这些值确实是在0.50左右,但从未超过0.50。无论我使用什么随机种子,都会得到这样的结果,所以这不是巧合。有什么解释可以说明这种行为吗?
# Create first network with Kerasfrom keras.models import Sequentialfrom keras.layers import Denseimport numpy as npnp.random.seed(90)X_train = np.random.rand(18,61250)X_test = np.random.rand(18,61250)Y_train = np.array([0.0, 1.0, 1.0, 0.0, 1.0, 1.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0,])Y_test = np.array([1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0,])_, input_size = X_train.shape# create modelmodel = Sequential()model.add(Dense(12, input_dim=input_size, init='uniform', activation='relu'))model.add(Dense(8, init='uniform', activation='relu'))model.add(Dense(1, init='uniform', activation='sigmoid'))# Compile modelmodel.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])# calculate predictionspredictions = model.predict(X_test)preds = [x[0] for x in predictions]print(preds)# Fit the modelmodel.fit(X_train, Y_train, epochs=100, batch_size=10, verbose=2, validation_data=(X_test,Y_test))
回答:
我不知道这是否准确回答了你的问题,但我一直在摆弄你的代码,并决定尝试一些东西。你的X数据是在0到1之间生成的,所以我尝试将其生成在0到10之间。这是一个结果预测的样本:
[0.53419214, 0.55088341, 0.53190422, 0.52382213, 0.53469753, 0.53098464,0.51968938, 0.53249627, 0.52852863, 0.52497149, 0.52816379, 0.5457474,0.52565753, 0.5276686, 0.52042121, 0.52128422, 0.52535951, 0.52730507]
如你所见,现在的结果超过了0.5。因为你在任何训练发生之前就预测了输出,所以预测是用随机权重完成的。是否可能是网络尚未适应输入向量的分布?
这些是训练后的预测结果:
[0.43440229, 0.48104468, 0.49194154, 0.4766106, 0.50065982, 0.47388917,0.51052755, 0.50618082, 0.48478326, 0.4846094, 0.50018799, 0.4800632,0.4181695, 0.48307362, 0.5063237, 0.50420266, 0.47321039, 0.44235682]
现在预测结果大致平衡。无论是哪种输入分布,我都得到了这种输出。我认为这与随机初始化的网络对输入数据分布的依赖性有关。训练后它会归一化。