为什么我的BP神经网络的准确性太低?

时间:2019-12-20 18:16:26

标签: python-3.x numpy tensorflow keras neural-network

作业正在通过BP神经网络识别手写数字。我尝试添加隐藏层,增加单位并更改激活度,动量,但结果显示:

  

测试Acc:0.11142061281337047

分裂数据集X:(1797,64)Y(1797,)

np.random.shuffle(X)
np.random.shuffle(y)
offset1=int(len(X)*0.6)
offset2=int(len(X)*0.8)
offset3=len(X)-1
X_train, y_train = X[0:offset1,:], y[0:offset1]
X_valid, y_valid = X[offset1:offset2,:], y[offset1:offset2]
X_test, y_test = X[offset2:offset3,:], y[offset2:offset3]

还有我的神经网络:

def create_network():
  # TODO
  net = tf.keras.Sequential()
  net.add(tf.keras.layers.Flatten())
  net.add(tf.keras.layers.Dense(64, activation='relu'))
  net.add(tf.keras.layers.Dense(64, activation='relu'))
  net.add(tf.keras.layers.Dense(10, activation='softmax'))
  net.compile(
      optimizer='adam',
      #tf.optimizers.SGD(learning_rate=0.01, momentum=0.0, nesterov=False), 
      loss="sparse_categorical_crossentropy", 
      metrics=["accuracy"])
  return net


def train_network(network,
                  X_train,
                  y_train,
                  X_valid,
                  y_valid,
                  n_epoch=32,
                  batch_size=64):
  n_iter = 0
  network.fit(x=X_train, y=y_train, epochs=n_epoch, validation_data=(X_valid,y_valid))
  #opt = tf.optimizers.SGD(learning_rate=0.01, momentum=0.0, nesterov=False) #SGD=Stochastic Gradient Descent



net = create_network()
train_network(net, X_train, y_train, X_valid, y_valid)

# evaluate on test set:
y_test_pred = net(X_test)
y_test_pred = np.argmax(y_test_pred.numpy(), axis=1)
print("Test Acc:", accuracy_score(y_true=y_test, y_pred=y_test_pred))

2 个答案:

答案 0 :(得分:1)

@NebiyouTen,我同意你所说的。但实际上np.random.shuffle不会返回任何内容。也许您需要做一些修改:

shuffled_ids = np.arange(len(x))
np.random.shuffle(shuffled_ids)
shuf_x = x[shuffled_ids]
shuf_y = y[shuffled_ids]

这是一种随机播放数据的替代方法:

random_state = np.random.get_state()
np.random.shuffle(x)
np.random.set_state(random_state)
np.random.shuffle(y)

答案 1 :(得分:0)

假设您的模型和训练正确,那么我看到的一个问题是,您正在分别改编xynp.random.shuffle将修改两个数组。完成后,训练点将不再与正确的标签正确匹配。因此,您的训练和预测无法按预期进行。您可以做类似的事情,

# shuffle the ids
shuffled_ids = np.arange(len(x)))
np.random.shuffle(shuffled_ids)
# index x & y with the same shuffled numbers, 
# so the correct relationship is maintained 
shuf_x = x[shuffled_ids]
shuf_y = y[shuffled_ids]