卷积神经网络CNN的简介和简单实现python |
您所在的位置:网站首页 › 二值神经网络训练 › 卷积神经网络CNN的简介和简单实现python |
卷积神经网络(Convolutional Neural Network,CNN)是一种深度学习模型,广泛应用于图像识别、语音识别、自然语言处理等领域。本文将介绍卷积神经网络的基本原理、结构和训练方法,并给出一个简单的代码示例。 一、卷积神经网络的基本原理 卷积神经网络是一种前馈神经网络,其基本原理是通过卷积操作提取输入数据的特征,然后通过池化操作减少特征的维度,最后通过全连接层进行分类或回归。 卷积操作是卷积神经网络的核心,其作用是将输入数据与卷积核进行卷积运算,得到特征图。卷积核是一个小的矩阵,其大小通常为3x3或5x5,可以通过训练得到。卷积操作可以有效地提取输入数据的局部特征,例如图像中的边缘、纹理等。 池化操作是卷积神经网络的另一个重要组成部分,其作用是减少特征图的维度,从而降低计算复杂度。常见的池化操作有最大池化和平均池化,其原理是在特定的区域内取最大值或平均值。 二、卷积神经网络的结构 卷积神经网络通常由多个卷积层、池化层和全连接层组成。其中,卷积层和池化层用于提取输入数据的特征,全连接层用于分类或回归。 卷积层通常包括多个卷积核,每个卷积核对应一个特征图。卷积操作可以通过卷积核在输入数据上滑动得到,得到的特征图可以通过激活函数进行非线性变换。常见的激活函数有ReLU、sigmoid和tanh等。 池化层通常用于减少特征图的维度,从而降低计算复杂度。最大池化和平均池化是常见的池化操作,其原理是在特定的区域内取最大值或平均值。 全连接层通常用于分类或回归,其作用是将特征图转换为输出结果。全连接层通常包括多个神经元,每个神经元对应一个输出类别或回归值。 三、卷积神经网络的训练方法 卷积神经网络的训练方法通常采用反向传播算法,其基本原理是通过计算损失函数的梯度来更新网络参数。常见的损失函数有交叉熵、均方误差等。 反向传播算法可以分为两个步骤:前向传播和反向传播。前向传播是指将输入数据通过网络得到输出结果的过程,反向传播是指根据损失函数计算梯度并更新网络参数的过程。 在训练过程中,通常采用随机梯度下降(Stochastic Gradient Descent,SGD)算法来更新网络参数。SGD算法的基本原理是通过计算损失函数的梯度来更新网络参数,从而使损失函数最小化。 import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data # 加载MNIST数据集 mnist = input_data.read_data_sets("MNIST_data/", one_hot=True) # 定义输入和输出 x = tf.placeholder(tf.float32, [None, 784]) y_ = tf.placeholder(tf.float32, [None, 10]) # 定义第一个卷积层 W_conv1 = tf.Variable(tf.truncated_normal([5, 5, 1, 32], stddev=0.1)) b_conv1 = tf.Variable(tf.constant(0.1, shape=[32])) x_image = tf.reshape(x, [-1, 28, 28, 1]) h_conv1 = tf.nn.relu(tf.nn.conv2d(x_image, W_conv1, strides=[1, 1, 1, 1], padding='SAME') + b_conv1) h_pool1 = tf.nn.max_pool(h_conv1, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME') # 定义第二个卷积层 W_conv2 = tf.Variable(tf.truncated_normal([5, 5, 32, 64], stddev=0.1)) b_conv2 = tf.Variable(tf.constant(0.1, shape=[64])) h_conv2 = tf.nn.relu(tf.nn.conv2d(h_pool1, W_conv2, strides=[1, 1, 1, 1], padding='SAME') + b_conv2) h_pool2 = tf.nn.max_pool(h_conv2, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME') # 定义全连接层 W_fc1 = tf.Variable(tf.truncated_normal([7 * 7 * 64, 1024], stddev=0.1)) b_fc1 = tf.Variable(tf.constant(0.1, shape=[1024])) h_pool2_flat = tf.reshape(h_pool2, [-1, 7 * 7 * 64]) h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, W_fc1) + b_fc1) # 定义输出层 W_fc2 = tf.Variable(tf.truncated_normal([1024, 10], stddev=0.1)) b_fc2 = tf.Variable(tf.constant(0.1, shape=[10])) y_conv = tf.matmul(h_fc1, W_fc2) + b_fc2 # 定义损失函数和优化器 cross_entropy = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y_conv)) train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy) # 定义评估模型的准确率 correct_prediction = tf.equal(tf.argmax(y_conv, 1), tf.argmax(y_, 1)) accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) # 训练模型 with tf.Session() as sess: sess.run(tf.global_variables_initializer()) for i in range(20000): batch = mnist.train.next_batch(50) if i % 100 == 0: train_accuracy = accuracy.eval(feed_dict={x: batch[0], y_: batch[1]}) print("step %d, training accuracy %g" % (i, train_accuracy)) train_step.run(feed_dict={x: batch[0], y_: batch[1]}) print("test accuracy %g" % accuracy.eval(feed_dict={x: mnist.test.images, y_: mnist.test.labels}))该代码使用TensorFlow实现了一个简单的卷积神经网络,用于对MNIST手写数字进行分类。该网络包括两个卷积层、两个池化层和一个全连接层,采用ReLU激活函数和交叉熵损失函数。在训练过程中,采用随机梯度下降算法来更新网络参数。最终,该网络在测试集上的准确率达到了99%以上。 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |