在不更改代码的情况下获得随机精度

时间:2019-03-03 22:44:29

标签: machine-learning keras neural-network

我有一个用于训练AND逻辑的简单Keras模型。不幸的是,有时一次又一次运行项目后,精度有时为0.751.0。为什么在不更改epochs或其他参数的情况下精度会发生变化。为什么会这样呢?

import numpy as np
import keras

from keras.models import Sequential
from keras.layers import Dense, Activation
from keras.optimizers import RMSprop
from keras.losses import binary_crossentropy

x_train = np.array([[1,1], [0,1], [1,0], [0,0]])
x_val = np.array([[0,1], [1,1], [1,0], [0,0]])
x_test = np.array([[0,1], [1,0], [1,1], [0,0]])


y_train = np.array([[1], [0], [0], [0]])
y_val = np.array([[0], [1], [0], [0]])
y_test = np.array([[0], [0], [1], [0]])

model = Sequential()
model.add(Dense(16, input_dim=2))
model.add(Activation('relu'))
model.add(Dense(1))
model.add(Activation('sigmoid'))

opt = RMSprop(lr=0.001)
model.compile(
    optimizer=opt,
    loss=binary_crossentropy,
    metrics=['accuracy']    
)

model.summary()

model.fit(x=x_train, y=y_train, batch_size=32, epochs=100, validation_data=(x_val, y_val))

score = model.evaluate(x_test, y_test, batch_size=32)

print('Test loss:', score[0])
print('Test accuracy:', score[1])

model.predict_classes(np.array([[0,1]]))

1 个答案:

答案 0 :(得分:1)

尽管样本(很小)很小(4个),并且实际上您没有单独的训练,验证和测试集(它们完全相同),但是您的模型不是确定性的 / em>:权重初始化中总是存在随机元素。有时这会导致模型可以正确预测所有(4 ...)训练样本(准确性1.0),有时会导致仅对一个样本进行错误分类的模型(准确性0.75)。没什么奇怪的。

  

为什么权重是随机初始化的?

还有什么?最好将它们初始化为0(您可以使用 bias 进行此操作,但不能使用权重进行此操作),因为这样您的模型将无法学习...

您可能会发现以下有用:

What are good initial weights in a neural network?(警告,因为它有点旧...)

Why Initialize a Neural Network with Random Weights?

  

我的意思是,有证据表明,一开始的一些权重对于精度而言更好?

不完全是;但是有证据表明,某些初始化方法在实践中效果更好。如今,Keras图层已使用glorot_uniform进行了初始化(请参见layers documentation中的默认kernel_initializer参数)。您可能需要看一下并尝试使用不同的initializers available in Keras。这仍然是一个活跃的研究领域...