卷积神经网络介绍与LeNet5的Tf实现

本文深入探讨了卷积神经网络(CNN)的核心概念,包括卷积、池化操作,以及权重共享和局部连接特性。并通过TensorFlow实现了一个经典的LeNet模型,详细介绍了其结构与训练过程。
部署运行你感兴趣的模型镜像

一、卷积

1.卷积神经网络

一种特殊的前馈神经网络,主要特点为卷积和池化。通常结构为:

  1. 全连接的输入层;
  2. 多个卷积、池化和全连接层组合;
  3. 全连接输出层与softmax组合。

2.卷积运算

卷积:将两个来源的信息结合产生一组新的信息的数学运算,将特殊矩阵-核应用于张量上产生矩阵-特征图。

  • 三维张量:深度叠加;
  • 步长、填充(SAME/VALID):size_featuremap=(size_image+2*padding-size_kernel)/strides +1;
  • 局部连接--感受野receptivce field;
  • 权重共享--每个卷积核有单独的权重矩阵weights和偏差标量bias,在所有滑动位置相同(共享)。

3.TensorFlow的卷积实现

tf.nn.conv2d(input,filter,strides,padding,use_cudnn_on_gpu=None,data_format=None,name=None)

  • input表式输入张量的形状[batch_size,input_height,input_width,input_depth];
  • filter表示滤波器张量形状[filter_height,filter_width,filter_depth,output_depth];

二、池化

池化是指对卷积特征空间区域的聚合统计。

平均池化/最大池化,通常非重叠。

max_pool(value,ksize,strides,padding,data_format='NHWC',name=None)

  • value表示形状为[batch_size,input_height,input_width,input_depth]的输入张量。
  • 通道顺序:NHWC,NCWH;

三、LeNet

1.LeNet

Yann Lecun;

结构:输入-卷积1/ReLU1-pooling1-Conv2/ReLU-pooling2-fc-output;

2.使用tensorflow实现LeNet5

1.定义超参数及占位符

X=tf.placeholder(dtype=tf.float32, name="x", shape=[None, n_inputs])

x_ = tf.reshape(x, shape=[-1, n_width, n_height, n_depth])

2.定义中间的卷积核(w、b)及卷积层(conv2d)、激活层(relu)、池化层----- relu( conv(x,w) +b )

# create first set of convolutional layers

layer1_w = tf.Variable(tf.random_normal(shape=[4,4,n_depth,32],

                                        stddev=0.1),

                       name='l1_w')

layer1_b = tf.Variable(tf.random_normal([32]),

                       name='l1_b')

layer1_conv = tf.nn.relu(tf.nn.conv2d(x_,

                                      layer1_w,

                                      strides=[1,1,1,1],

                                      padding='SAME'

                                     ) +  layer1_b )

layer1_pool = tf.nn.max_pool(layer1_conv,

                             ksize=[1,2,2,1],

                             strides=[1,2,2,1],

                             padding='SAME'

                            )

3.Flat-fc-relu

tf.nn.relu(tf.matmul(tf.reshape(layer2_pool, [-1, 64*7*7*1]),layer3_w) +layer3_b )

4.输出层

layer4_out = tf.matmul(layer3_fc,layer4_w)+layer4_b

model = layer4_out

5.定义损失函数softmax_cross_entropy_with_logits,优化器AdamOptimizer

# loss function

entropy = tf.nn.softmax_cross_entropy_with_logits(logits=model, labels=y)

loss = tf.reduce_mean(entropy)

# optimizer function

optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(loss)

您可能感兴趣的与本文相关的镜像

TensorFlow-v2.15

TensorFlow-v2.15

TensorFlow

TensorFlow 是由Google Brain 团队开发的开源机器学习框架,广泛应用于深度学习研究和生产环境。 它提供了一个灵活的平台,用于构建和训练各种机器学习模型

### 使用卷积神经网络实现LeNet-5手写数字识别 为了实现基于MNIST数据集的手写数字识别,可以采用经典的LeNet-5架构。该模型由多个层组成,包括两个卷积层、池化层以及全连接层等结构[^1]。 以下是完整的Python代码示例来构建并训练一个LeNet-5模型: ```python import tensorflow as tf from tensorflow.keras import datasets, layers, models import matplotlib.pyplot as plt # 加载和预处理数据 (train_images, train_labels), (test_images, test_labels) = datasets.mnist.load_data() train_images = train_images.reshape((60000, 28, 28, 1)) test_images = test_images.reshape((10000, 28, 28, 1)) # 归一化像素值到[0,1]区间内 train_images, test_images = train_images / 255.0, test_images / 255.0 # 构建LeNet-5模型 model = models.Sequential() model.add(layers.Conv2D(6, kernel_size=(5, 5), activation='tanh', input_shape=(28, 28, 1))) model.add(layers.AveragePooling2D(pool_size=(2, 2))) model.add(layers.Conv2D(16, kernel_size=(5, 5), activation='tanh')) model.add(layers.AveragePooling2D(pool_size=(2, 2))) model.add(layers.Flatten()) model.add(layers.Dense(120, activation='tanh')) model.add(layers.Dense(84, activation='tanh')) model.add(layers.Dense(10, activation='softmax')) # 编译模型 model.compile(optimizer='adam', loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True), metrics=['accuracy']) history = model.fit(train_images, train_labels, epochs=10, validation_data=(test_images, test_labels)) plt.plot(history.history['accuracy'], label='accuracy') plt.plot(history.history['val_accuracy'], label = 'validation accuracy') plt.xlabel('Epoch') plt.ylabel('Accuracy') plt.legend(loc='lower right') test_loss, test_acc = model.evaluate(test_images, test_labels, verbose=2) print(f"Test Accuracy: {test_acc}") ``` 这段代码实现LeNet-5的核心功能,并通过TensorFlow框架进行了简化操作。它不仅定义了所需的各层参数配置,还包含了数据加载、预处理及可视化部分的结果分析图表绘制过程[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值