Keras大法(6)——实现LeNet5模型

Keras大法(6)——实现LeNet5模型


在这里插入图片描述

(1)模型结构

模型结构如下:
在这里插入图片描述

(2)模型代码

import tensorflow as tf
from tensorflow import keras

import os
os.environ["CUDA_VISIBLE_DEVICES"] = "2"

# 使用tf.data进行数据馈送,此为参考示例
def parse_function(example_proto):
    features = {
        'label' : tf.FixedLenFeature([], tf.int64),
        'img_raw' : tf.FixedLenFeature([], tf.string)
    }
    parsed_features = tf.parse_single_example(example_proto, features)
    img = tf.decode_raw(parsed_features['img_raw'], tf.uint8)
    img = tf.reshape(img, [224, 224, 3])
    img = tf.cast(img, tf.float32) / 255
    label = tf.one_hot(parsed_features['label'], depth= 2)
    #label = to_categorical(parsed_features['label'], num_classes= 8)
    return img, label
dataset = tf.data.TFRecordDataset(r"C:\Users\12394\PycharmProjects\Chest X-Ray Automatic Identification\dataset\train.tfrecords")
dataset = dataset.map(parse_function)
dataset = dataset.repeat()
dataset = dataset.shuffle(buffer_size= 5).batch(4)

# Define the input layer
inputs = keras.Input(shape = [224, 224, 3])
# Define the converlutional layer 1
conv1 = keras.layers.Conv2D(filters= 6, kernel_size= [5, 5], strides= (1, 1), padding= 'same',activation= keras.activations.relu,use_bias=True)(inputs)
# Define the pooling layer 1
pooling1 = keras.layers.MaxPooling2D(pool_size= (2, 2), strides= (2, 2), padding= 'same')(conv1)
# Define the converlutional layer 2
conv2 = keras.layers.Conv2D(filters= 16, kernel_size= (5, 5), strides= (1, 1), padding= 'same', activation= keras.activations.relu, use_bias=True)(pooling1)
# Define the pooling layer 2
pooling2 = keras.layers.MaxPooling2D(pool_size= (2, 2), strides= (2, 2), padding= 'valid')(conv2)
# Define the converlutional layer 3
conv3 = keras.layers.Conv2D(filters= 120, kernel_size= (5, 5), strides= (1, 1), padding= 'same', activation= keras.activations.relu, use_bias=True)(pooling2)
# Define the fully connected layer

flatten = keras.layers.Flatten()(conv3)
connected = keras.layers.Dense(80, activation= keras.activations.relu, use_bias=True)(flatten)

predictions = keras.layers.Dense(2, activation= 'softmax', use_bias=True)(connected)

# 基于Model方法实现模型
model = keras.Model(inputs= inputs, outputs = predictions)
# 编译模型
model.compile(optimizer= tf.train.AdamOptimizer(0.01),
              loss= keras.losses.categorical_crossentropy,
              metrics= ['accuracy'])
# 训练配置,仅供参考
model.fit(dataset, epochs = 5, steps_per_epoch= 4442)
model.save('模型文件地址')

(3)总 结

在这一节中我们使用Keras实现了LeNet5模型,有任何的疑问请在评论区留言,我会尽快回复,谢谢支持!

LeNet-5神经网络 C源代码,这个写的比较好,可以用gcc编译去跑,结合理论可以对深度学习有更深刻的了解 介绍 根据YANN LECUN的论文《Gradient-based Learning Applied To Document Recognition》设计的LeNet-5神经网络,C语言写成,不依赖任何第三方库。 MNIST手写字符集初代训练识别率97%,多代训练识别率98%。 DEMO main.c文件为MNIST数据集的识别DEMO,直接编译即可运行,训练集60000张,测试集10000张。 项目环境 该项目为VISUAL STUDIO 2015项目,用VISUAL STUDIO 2015 UPDATE1及以上直接打开即可编译。采用ANSI C编写,因此源码无须修改即可在其它平台上编译。 如果因缺少openmp无法编译,请将lenet.c中的#include和#pragma omp parallel for删除掉即可。 API #####批量训练 lenet: LeNet5的权值的指针,LeNet5神经网络的核心 inputs: 要训练的多个图片对应unsigned char二维数组的数组,指向的二维数组的batchSize倍大小内存空间指针。在MNIST测试DEMO中二维数组为28x28,每个二维数组数值分别为对应位置图像像素灰度值 resMat:结果向量矩阵 labels:要训练的多个图片分别对应的标签数组。大小为batchSize batchSize:批量训练输入图像(二维数组)的数量 void TrainBatch(LeNet5 *lenet, image *inputs, const char(*resMat)[OUTPUT],uint8 *labels, int batchSize); #####单个训练 lenet: LeNet5的权值的指针,LeNet5神经网络的核心 input: 要训练的图片对应二维数组 resMat:结果向量矩阵 label: 要训练的图片对应的标签 void Train(LeNet5 *lenet, image input, const char(*resMat)[OUTPUT],uint8 label); #####预测 lenet: LeNet5的权值的指针,LeNet5神经网络的核心 input: 输入的图像的数据 labels: 结果向量矩阵指针 count: 结果向量个数 return 返回值为预测的结果 int Predict(LeNet5 *lenet, image input, const char(*labels)[LAYER6], int count); #####初始化 lenet: LeNet5的权值的指针,LeNet5神经网络的核心
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Friedrich Yuan

拒绝白嫖,从我做起!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值