📜  卷积神经网络(CNN)在 Tensorflow 中的工作(1)

📅  最后修改于: 2023-12-03 14:50:30.812000             🧑  作者: Mango

卷积神经网络(CNN)在 Tensorflow 中的工作

简介

卷积神经网络(CNN, Convolutional Neural Network)是深度学习中应用较广泛的一种类型,其主要用于图像、语音、视频等感知领域的应用,具有较好的空间特征学习和分类能力。

Tensorflow 是目前应用广泛的深度学习框架之一,提供了丰富的CNN相关API和工具,使得开发者可以快速构建和训练自己的卷积神经网络模型。

本文将介绍CNN在Tensorflow中的工作原理和基本用法,为开发者提供一个快速上手的指南。

CNN在Tensorflow中的工作原理

在Tensorflow中,使用卷积神经网络主要分为以下几个步骤:

  1. 定义输入层
  2. 定义卷积层
  3. 定义池化层
  4. 定义全连接层
  5. 定义输出层

其中输入层定义输入数据的维度和格式,卷积层定义卷积运算的参数和输出特征图的维度,池化层定义池化运算的方式和输出特征图的维度,全连接层定义全连接层的神经元个数和激活函数,输出层定义输出数据的格式和损失函数。

在定义完各层的参数和结构后,使用Tensorflow提供的优化器和损失函数对网络进行训练和优化,使得网络可以更好地适应任务需求。

CNN在Tensorflow中的基本用法
1.导入模块

首先需要导入Tensorflow和numpy等相关模块。

import tensorflow as tf
import numpy as np
2.定义网络结构

定义CNN网络的结构,包括输入层、卷积层、池化层、全连接层和输出层。在这里以构建一个简单的MNIST手写数字识别模型为例。

# 定义输入数据格式
input_shape = (None, 28, 28, 1) # None表示输入的数据可以是任意batch大小

# 定义占位符
inputs = tf.placeholder(tf.float32, shape=input_shape)
labels = tf.placeholder(tf.int32, shape=(None,))

# 定义卷积层和池化层
conv1 = tf.layers.conv2d(inputs, filters=32, kernel_size=(3, 3), padding='same', activation=tf.nn.relu)
pool1 = tf.layers.max_pooling2d(conv1, pool_size=(2, 2), strides=(2, 2), padding='same')

conv2 = tf.layers.conv2d(pool1, filters=64, kernel_size=(3, 3), padding='same', activation=tf.nn.relu)
pool2 = tf.layers.max_pooling2d(conv2, pool_size=(2, 2), strides=(2, 2), padding='same')

# 定义全连接层
fc1 = tf.layers.dense(tf.layers.flatten(pool2), units=128, activation=tf.nn.relu)
fc2 = tf.layers.dense(fc1, units=10, activation=None)

# 定义输出层
predictions = tf.argmax(fc2, axis=-1)
cross_entroy = tf.losses.sparse_softmax_cross_entropy(labels, fc2)
loss = tf.reduce_mean(cross_entroy)

# 定义优化器
optimizer = tf.train.AdamOptimizer(learning_rate=0.001)
train_op = optimizer.minimize(loss)

以上代码构建了一个包含两层卷积、两层池化和两层全连接的CNN网络,使用交叉熵损失函数和Adam优化器对网络进行训练。

3.读取数据

在构建CNN网络之前需要先将需要的数据读入内存中。在这里我们使用MNIST数据集来训练CNN网络。可以使用Tensorflow提供的数据读取函数来读取MNIST数据集。

# 读取MNIST数据集
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("MNIST_data/", one_hot=False)
4.训练网络

有了数据之后,就可以开始训练CNN网络了。需要定义一些超参数,如训练轮数、batch大小、学习率等,然后在训练过程中,使用session.run()函数运行网络,并在每轮结束时计算loss和准确率。

# 训练CNN网络
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())

    for i in range(10000):
        batch_xs, batch_ys = mnist.train.next_batch(100)
        feed_dict = {inputs: batch_xs.reshape(-1, 28, 28, 1), labels: batch_ys}
        sess.run(train_op, feed_dict=feed_dict)

        if i % 100 == 0:
            batch_xs, batch_ys = mnist.test.next_batch(100)
            feed_dict = {inputs: batch_xs.reshape(-1, 28, 28, 1), labels: batch_ys}
            loss_val, acc_val = sess.run([loss, accuracy], feed_dict=feed_dict)
            print("Step: {}, Loss: {:.4f}, Accuracy: {:.4f}".format(i, loss_val, acc_val))

训练结束后,我们可以使用训练好的模型对新的数据进行预测,并计算准确率。

5.测试和预测

训练好的CNN网络可以用于对新的数据进行测试和预测。我们可以定义一个函数来进行测试和预测。

# 测试和预测CNN网络
def test_cnn(sess, inputs, predictions, x_test, y_test):
    feed_dict = {inputs: x_test.reshape(-1, 28, 28, 1)}
    preds = sess.run(predictions, feed_dict=feed_dict)
    acc = np.mean(preds == y_test)
    print("Accuracy: {:.4f}".format(acc))
    return preds

以上代码定义了一个test_cnn()函数,该函数接受一个已经训练好的CNN网络的session,输入占位符,以及一个测试集数据集和标签集,用于测试和预测模型的准确率和预测结果。在使用该函数进行测试和预测时,需要将x_test数据集reshape成(batch_size, 28, 28, 1)的形式。

总结

本文介绍了CNN在Tensorflow中的工作原理和基本用法,包括定义网络结构、读取数据、训练和预测、测试和预测等几个方面的内容。希望可以对开发者有所帮助,方便其使用CNN构建自己的深度学习模型。