python - MNIST 数据集的 Keras 准确度没有变化

标签 python machine-learning neural-network keras mnist

我是机器学习新手,我的任务是复制 Binarized Neural Networks: Training Neural Networks with Weights and Activations Constrained to +1 or −1 中的代码。我想在 Keras 上实现它。 我写了如下代码,但是得到的结果卡在9.87%

BNN.ipynb

import keras
from keras.models import Sequential
from keras.layers import Conv2D, MaxPooling2D,Dropout, Flatten, Dense
from keras.datasets import mnist
from keras.layers import Dense, Activation, BatchNormalization
from keras.constraints import min_max_norm
from keras.optimizers import SGD


from activations import binary_tanh as binary_tanh_op

#Load the data
(X_train, y_train), (X_test, y_test) = mnist.load_data()
X_train = X_train.reshape(-1, 784)
X_test = X_test.reshape(-1, 784)
X_train = X_train.astype('float32')
X_test = X_test.astype('float32')
X_train /= 255
X_test /= 255

#one-hot encoding
y_train = keras.utils.to_categorical(y_train, 10)
y_test = keras.utils.to_categorical(y_test, 10)

#import to obtain _hard_tanh activation
def binary_tanh(x):
    return binary_tanh_op(x)

model = Sequential()
model.add(Dense(256, input_dim=784, activation=binary_tanh, kernel_initializer='glorot_uniform', bias_initializer='zeros'))
BatchNormalization(momentum=0.9,epsilon=0.000001)
model.add(Dense(128,activation=binary_tanh))
BatchNormalization(momentum=0.9,epsilon=0.000001)
model.add(Dense(64,activation=binary_tanh))
BatchNormalization(momentum=0.9,epsilon=0.000001)
model.add(Dense(10, activation=binary_tanh))

# Step 2: Build the Model

print(model.summary())
for layer in model.layers:
    h = layer.get_weights()
print(h)

opt = SGD(lr=0.000001)

# Step 3: Compile the Model
model.compile(loss='categorical_crossentropy',optimizer=opt,metrics=['accuracy'])

# Step 4: Train the Model
model.fit(X_train,y_train,epochs=50,batch_size=100)

这是activations.py文件

from __future__ import absolute_import
import keras.backend as K


def round_through(x):
    '''Element-wise rounding to the closest integer with full gradient propagation.
    A trick from [Sergey Ioffe](http://stackoverflow.com/a/36480182)
    '''
    rounded = K.round(x)
    return x + K.stop_gradient(rounded - x)


def _hard_sigmoid(x):
    '''Hard sigmoid different from the more conventional form (see definition of K.hard_sigmoid).

    # Reference:
    - [BinaryNet: Training Deep Neural Networks with Weights and Activations Constrained to +1 or -1, Courbariaux et al. 2016](http://arxiv.org/abs/1602.02830}

    '''
    x = (0.5 * x) + 0.5
    return K.clip(x, 0, 1)


def binary_sigmoid(x):
    '''Binary hard sigmoid for training binarized neural network.

    # Reference:
    - [BinaryNet: Training Deep Neural Networks with Weights and Activations Constrained to +1 or -1, Courbariaux et al. 2016](http://arxiv.org/abs/1602.02830}

    '''
    return round_through(_hard_sigmoid(x))


def binary_tanh(x):
    '''Binary hard sigmoid for training binarized neural network.
     The neurons' activations binarization function
     It behaves like the sign function during forward propagation
     And like:
        hard_tanh(x) = 2 * _hard_sigmoid(x) - 1 
        clear gradient when |x| > 1 during back propagation

    # Reference:
    - [BinaryNet: Training Deep Neural Networks with Weights and Activations Constrained to +1 or -1, Courbariaux et al. 2016](http://arxiv.org/abs/1602.02830}

    '''
    return 2 * round_through(_hard_sigmoid(x)) - 1


def binarize(W, H=1):
    '''The weights' binarization function, 

    # Reference:
    - [BinaryNet: Training Deep Neural Networks with Weights and Activations Constrained to +1 or -1, Courbariaux et al. 2016](http://arxiv.org/abs/1602.02830}

    '''
    # [-H, H] -> -H or H
    Wb = H * binary_tanh(W / H)
    return Wb


def _mean_abs(x, axis=None, keepdims=False):
    return K.stop_gradient(K.mean(K.abs(x), axis=axis, keepdims=keepdims))


def xnorize(W, H=1., axis=None, keepdims=False):
    Wb = binarize(W, H)

我尝试将学习率从 0.001 更改为 0.000001,优化器从 Adam 更改为 SGD,添加了 dropout 率,但我的模型仍然停留在 9.87% Training Result here

有没有办法将准确率提高到90%以上?

最佳答案

您有 10 个不同的类别,因此您的准确度为 9.xx% 基本上表明您的神经网络的猜测完全是随机的。

这是由于您的学习率值为 0.000001,该值太低,无法在仅 50 个时期内显着地改变任何权重。将其更改为 0.001 之类的内容,看看会发生什么!

关于python - MNIST 数据集的 Keras 准确度没有变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52137645/

相关文章:

python - 如何为 Python 安装 SimpleJson 包

python - 从 stdout 获取原始流数据到 python 程序

authentication - 使机器学习算法适应我的问题

python-3.x - Tensorflow - model.fit 中的值错误 - 如何修复

machine-learning - Keras 文本预处理 - 将 Tokenizer 对象保存到文件以进行评分

python - 字典键和值的笛卡尔积 Python

python - 在pySpark中处理空数组(可选的二进制元素(UTF8)不是一个组)

machine-learning - 使用大量数据偏向某一类别来预测类别

mongodb - max_df 对应的文档比 Ridge 分类器中的 min_df 错误

python - 我对 keras 图层大小有什么误解?