作业正在通过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))
答案 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)
假设您的模型和训练正确,那么我看到的一个问题是,您正在分别改编x
和y
。 np.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]