jacksonnnm 2021-12-22 15:41 采纳率: 0%
浏览 122

为什么我的手写数字识别机器学习的准确率在迭代30次之后就会开始下降呢?

问题遇到的现象和发生背景

机器学习的手写数字识别,用了mnist数据集,可是在迭代30轮之后训练和测试的准确都会开始下降这是为什么呢?

问题相关代码,请勿粘贴截图
import numpy as np
from keras.models import Sequential
from keras.layers import Dense
from tensorflow.keras.optimizers import SGD
from keras.utils import np_utils
import matplotlib .pyplot as plt
from pylab import mpl

def splitdata(datalist):
    inputs_list = []
    targets_list = []
    for record in datalist:
        all_values=record.split(',')
        inputs=np.asfarray(all_values[1:])/255
        targets=np.zeros(10)
        targets[int(all_values[0])]=1
        inputs_list.append(inputs)
        targets_list.append(targets)
    return np.array(inputs_list), np.array(targets_list)
train_data_file=open('E:\mnist_dataset_csv\mnist_train.csv','r')

train_data_list=train_data_file.readlines()
train_data_file.close()
train_inputs,train_targets = splitdata(train_data_list)

test_data_file = open('E:\mnist_dataset_csv\mnist_test.csv','r')
test_data_list = test_data_file.readlines()
test_data_file.close()
test_inputs,test_targets = splitdata(test_data_list)

def create_model(num_inputs,hidden_nodes,num_classes):
        model = Sequential()

        model.add(Dense(units=hidden_nodes, input_dim=num_inputs,kernel_initializer='normal',activation='sigmoid'))
        model.add(Dense(units=num_classes,kernel_initializer='normal',activation='sigmoid'))
        model.compile(loss='categorical_crossentropy',optimizer=SGD(lr=0.1), metrics=['accuracy'])
        return model

def score(nn, inputs, targets):
        scorecord = []
        outputs = nn.predict(inputs)
        for i in range(outputs.shape[0]):

            correct_label = np.argmax(targets[i])

            label = np.argmax(outputs[i])

            if(label == correct_label):
                scorecord.append(1)
            else:
                scorecord.append(0)

        scorecord_array = np.asarray(scorecord)

        return scorecord_array.sum() / scorecord_array.size

model = create_model(train_inputs.shape[1],50,train_targets.shape[1])

train_scores=[]
test_scores=[]
for e in range(50):
    print('第%d次迭代...'%(e+1))
    model.fit(x=train_inputs,y=train_targets,epochs=1,batch_size=1)
    train_scores.append(score(model,train_inputs,train_targets))
    test_scores.append(score(model,test_inputs,test_targets))
    print('训练准确率:%f'%train_scores[e])
    print('测试准确率:%f'%test_scores[e])

mpl.rcParams['font.sans-serif'] = ['FangSong']
mpl.rcParams['axes.unicode_minus'] = False

plt.figure(figsize=(10,4))
plt.xlabel('迭代轮数')
plt.ylabel('准确率')
plt.plot(range(1,51),train_scores,c='red',label='训练准确率')
plt.plot(range(1,51),test_scores,c='blue',label='测试准确率')
plt.legend(loc='best')
plt.grid(True)
plt.show()

运行结果及报错内容

img

img

img

我的解答思路和尝试过的方法
我想要达到的结果
  • 写回答

2条回答 默认 最新

  • 於黾 2021-12-22 15:48
    关注

    当你的参数数量太少,或者参数精度过低,那么你就不可能期待最终学习的效果有多好。
    不管你参数再多,再精确,它总会有个上限,永远到不了100%
    当你学习次数到了一定程度,成果已经达到了所能达到的最好,继续学习只能让你的参数偏离最优解

    评论

报告相同问题?

问题事件

  • 创建了问题 12月22日

悬赏问题

  • ¥15 为什么使用javacv转封装rtsp为rtmp时出现如下问题:[h264 @ 000000004faf7500]no frame?
  • ¥15 乘性高斯噪声在深度学习网络中的应用
  • ¥15 运筹学排序问题中的在线排序
  • ¥15 关于docker部署flink集成hadoop的yarn,请教个问题 flink启动yarn-session.sh连不上hadoop,这个整了好几天一直不行,求帮忙看一下怎么解决
  • ¥30 求一段fortran代码用IVF编译运行的结果
  • ¥15 深度学习根据CNN网络模型,搭建BP模型并训练MNIST数据集
  • ¥15 C++ 头文件/宏冲突问题解决
  • ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
  • ¥50 安卓adb backup备份子用户应用数据失败
  • ¥20 有人能用聚类分析帮我分析一下文本内容嘛