sign-language-mnist神经网络搭建

获取数据集

26字母手势识别数据集.csv格式
提取码:jzyc

加载数据

import csv
import numpy as np
import tensorflow as tf
from tensorflow.keras.preprocessing.image import ImageDataGenerator
import cv2


# 获取数据
def get_data(file_name):
    with open(file_name) as f:
        csv_reader = csv.reader(f, delimiter=',')
        first_line = True # csv文件中第一行维标题行,不能载入数据
        temp_images = []
        temp_labels = []
        for row in csv_reader: 
            if first_line:
                first_line = False
                continue
            else:
                temp_labels.append(row[0])# csv文件中第一列为图片的label
                image_data = row[1 : 785]# 后面784列为图像每一个像素点对应的亮度值,读出来的是一个列表,需要将其划分为28*28的图像
                image_array = np.array_split(image_data, 28)
                temp_images.append(image_array)
        images = np.array(temp_images).astype('float')
        labels = np.array(temp_labels).astype('float')
    return images, labels

training_images, training_labels = get_data('E:/datasets/tmp/sign-language-mnist/sign_mnist_train.csv')
testing_images, testing_labels = get_data('E:/datasets/tmp/sign-language-mnist/sign_mnist_test.csv')
print(training_images.shape)
print(training_labels.shape)
print(testing_images.shape)
print(testing_labels.shape)

在这里插入图片描述

图像预处理

图像生成器,图像形态学操作

training_images = np.expand_dims(training_images, axis=3)
testing_images = np.expand_dims(testing_images, axis=3)
# 
train_datagen = ImageDataGenerator(
    rescale=1. / 255,
    rotation_range=40,
    width_shift_range=0.2,
    height_shift_range=0.2,
    shear_range=0.2,
    zoom_range=0.2,
    horizontal_flip=True,
    fill_mode='nearest')
train_generator = train_detagen.flow(training_images, training_labels, batch_size=32)
validation_datagen = ImageDataGenerator(
    rescale=1. / 255)
validation_generator = validation_datagen.flow(testinng_images, testing_labels, batch_size=32)

搭建神经网络

上一篇文章搭建的简单的网络的准确率有点低,这次我准备搭建一个深一点的网络VGG16

model = tf.keras.Sequential()
# 卷积组-1
model.add(layers.Conv2D(64, (3, 3), activation='relu', input_shape=(28, 28, 1), padding='same',  name='conv-1'))
model.add(layers.Conv2D(64, (3, 3), activation='relu', padding='same',  name='conv-2'))
# 池化-1
model.add(layers.MaxPool2D((2, 2), name='maxpooling-1'))
# 卷积组-2
model.add(layers.Conv2D(128, (3, 3), activation='relu', padding='same',  name='conv-3'))
model.add(layers.Conv2D(128, (3, 3), activation='relu', padding='same',  name='conv-4'))
# 池化-2
model.add(layers.MaxPooling2D((2, 2), name='maxpooling-2'))
# 卷积组-3
model.add(layers.Conv2D(256, (3, 3), activation='relu', padding='same',  name='conv-5'))
model.add(layers.Conv2D(256, (3, 3), activation='relu', padding='same',  name='conv-6'))
model.add(layers.Conv2D(256, (3, 3), activation='relu', padding='same',  name='conv-7'))
# 池化-3
model.add(layers.MaxPooling2D((2, 2), name="maxpooling-3"))
# 卷积组-4
model.add(layers.Conv2D(512, (3, 3), activation='relu', padding='same',  name='conv-8'))
model.add(layers.Conv2D(512, (3, 3), activation='relu', padding='same',  name='conv-9'))
model.add(layers.Conv2D(512, (3, 3), activation='relu', padding='same',  name='conv-10'))
# 池化-4
model.add(layers.MaxPooling2D((2, 2), name="maxpooling-4"))
# 卷积组-5
model.add(layers.Conv2D(512, (3, 3), activation='relu', padding='same',  name='conv-11'))
model.add(layers.Conv2D(512, (3, 3), activation='relu', padding='same',  name='conv-12'))
model.add(layers.Conv2D(512, (3, 3), activation='relu', padding='same',  name='conv-13'))

# 展平
model.add(layers.Flatten())
# 全连接-1
model.add(layers.Dense(4096, activation='relu', name='fully-1'))
# 全连接-2
model.add(layers.Dense(4096, activation='relu', name='fully-2'))
# 全连接-3
model.add(layers.Dense(4096, activation='relu', name='fully-3'))
# softmax
model.add(layers.Dense(26, activation='softmax', name='softmax'))

model.summary()

model.compile(optimizer = tf.optimizers.Adam(),
              loss = 'sparse_categorical_crossentropy',
              metrics=['accuracy'])

history = model.fit(train_generator,
                              steps_per_epoch=len(training_images) / 32,
                              epochs=1,
                              validation_data=validation_generator,
                              validation_steps=len(testing_images) / 32)

model.evaluate(testing_images, testing_labels)

在这里插入图片描述
在这里插入图片描述
13层卷积,3层全连接刚好16层

结果算一个epoch就需要14分钟
在这里插入图片描述
所以劝诫大家,对于视觉神经网络的实现能用GPU版本就不要用CPU,太慢了,浪费大把时间
在这里插入图片描述
跑一遍下来,准确率还很低
算了,不跑了,自己跑了两轮,loss没降落,accuracy没升

损失,准确值散点图

import matplotlib.pyplot as plt
acc = history.history['accuracy']
val_acc = history.history['val_accuracy']
loss = history.history['loss']
val_loss = history.history['val_loss']

epochs = range(len(acc))

plt.plot(epochs, acc, 'r', label='Training accuracy')
plt.plot(epochs, val_acc, 'b', label='Validation accuracy')
plt.title('Training and validation accuracy')
plt.legend()
plt.figure()

plt.plot(epochs, loss, 'r', label='Training Loss')
plt.plot(epochs, val_loss, 'b', label='Validation Loss')
plt.title('Training and validation loss')
plt.legend()

plt.show()

没跑完,就♣

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好!Fashion-MNIST是一个流行的图像分类数据集,用于训练和测试机器学习模型。卷积神经网络(Convolutional Neural Network,CNN)是一种常用的深度学习模型,特别适用于图像相关的任务。 要使用卷积神经网络对Fashion-MNIST数据集进行分类,通常需要以下步骤: 1. 准备数据集:首先,您需要下载Fashion-MNIST数据集并加载到您的程序中。这个数据集包含了10个类别的服装图像,每个类别有6000张训练图像和1000张测试图像。 2. 数据预处理:在训练模型之前,您需要对数据进行预处理。这通常包括将像素值归一化到0到1之间,将标签转换为独热编码(one-hot encoding),以及将数据划分为训练集和验证集。 3. 构建卷积神经网络模型:使用卷积层、池化层和全连接层来构建您的卷积神经网络模型。您可以选择不同的架构和超参数来优化模型性能。 4. 模型训练:使用训练集对模型进行训练。通过反向传播和梯度下降算法,不断调整模型参数以最小化损失函数。 5. 模型评估:使用测试集评估模型的性能。计算准确率、精确率、召回率等指标,了解模型在未见过的数据上的表现。 6. 模型优化:根据评估结果,对模型进行调整和优化。可以尝试不同的网络架构、正则化技术、优化算法等来提升模型性能。 这只是一个简要的概述,实际上在实现Fashion-MNIST卷积神经网络时,还需要考虑数据增强、调参等细节。如果您需要更具体的代码实现或深入的解释,请告诉我。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值