silent2Sky 2019-03-27 19:56 采纳率: 33.3%
浏览 1296
已结题

使用keras搭建黑体汉字单个字符识别网络val_acc=0.0002

这是我读入训练数据的过程,数据集是根据txt文件生成的单个汉字的图像(shape为64*64)788种字符(包括数字和X字符),每张图片的开头命名为在txt字典中的位置,作为标签,

    def read_train_image(self, name):
        img = Image.open(name).convert('RGB')
        return np.array(img)

    def train(self):
        train_img_list = []
        train_label_list = []
        for file in os.listdir('train'):
            files_img_in_array = self.read_train_image(name='train/'+ file)
            train_img_list.append(files_img_in_array)  # Image list add up
            train_label_list.append(int(file.split('_')[0]))  # lable list addup

        train_img_list = np.array(train_img_list)
        train_label_list = np.array(train_label_list)

        train_label_list = np_utils.to_categorical(train_label_list,
                                                   self.count)  

        train_img_list = train_img_list.astype('float32')
        train_img_list /= 255

训练下来,虽然train_acc达到0.99,但是验证accuracy一直都等于0.
下面是网络结构:

  model = Sequential()

        #创建第一个卷积层。
        model.add(Convolution2D(32, 3, 3, border_mode='valid', input_shape=(64,64,3),kernel_regularizer=l2(0.0001)))
        model.add(BatchNormalization(axis=3))
        model.add(Activation('relu'))

        model.add(MaxPooling2D(pool_size=(2, 2)))

        #创建第二个卷积层。
        model.add(Convolution2D(64, 3, 3, border_mode='valid',kernel_regularizer=l2(0.0001)))
        model.add(BatchNormalization())
        model.add(Activation('relu'))

        model.add(MaxPooling2D(pool_size=(2, 2)))
        #创建第三个卷积层。
        model.add(Convolution2D(128, 3, 3, border_mode='valid',kernel_regularizer=l2(0.0001)))
        model.add(BatchNormalization())
        model.add(Activation('relu'))

        model.add(MaxPooling2D(pool_size=(2, 2)))
        # 创建全连接层。
        model.add(Flatten())
        model.add(Dense(128, init= 'he_normal'))
        model.add(BatchNormalization())
        model.add(Activation('relu'))
        #创建输出层,使用 Softmax函数输出属于各个字符的概率值。
        model.add(Dense(output_dim=self.count, init= 'he_normal'))
        model.add(Activation('softmax'))
        #设置神经网络中的损失函数和优化算法。
        model.compile(loss='categorical_crossentropy', optimizer='adam',metrics=['accuracy'])
        #开始训练,并设置批尺寸和训练的步数。
        model.fit(
            train_img_list,
            train_label_list,
            epochs=500,
            batch_size=128,
            validation_split=0.2,
            verbose=1,
            shuffle= False,
        )

大概结构是这样,十几轮后训练集acc达到了0.99.验证集val_acc为0.网上说这种情况大概是过拟合了,希望高手指点一下。

  • 写回答

2条回答 默认 最新

  • threenewbee 2019-03-27 20:54
    关注

    你的数据量有多大,几千个汉字,就是几千的分类,你的样本太少就会学不动
    你可以先从英文字母或者数字识别试起

    评论

报告相同问题?

悬赏问题

  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办
  • ¥15 kylin启动报错log4j类冲突
  • ¥15 超声波模块测距控制点灯,灯的闪烁很不稳定,经过调试发现测的距离偏大
  • ¥15 import arcpy出现importing _arcgisscripting 找不到相关程序