tensorflow2.0如何实现cnn的图像识别

作者:zhangztSky 时间:2022-05-01 21:19:58 

tensorflow2.0实现cnn图像识别

import  tensorflow as tf
from    tensorflow.keras import layers, optimizers, datasets, Sequential
import  os

os.environ['TF_CPP_MIN_LOG_LEVEL']='2'
tf.random.set_seed(2345)

conv_layers = [ # 5 units of conv + max pooling
   # unit 1
   layers.Conv2D(64, kernel_size=[3, 3], padding="same", activation=tf.nn.relu),
   layers.Conv2D(64, kernel_size=[3, 3], padding="same", activation=tf.nn.relu),
   layers.MaxPool2D(pool_size=[2, 2], strides=2, padding='same'),

# unit 2
   layers.Conv2D(128, kernel_size=[3, 3], padding="same", activation=tf.nn.relu),
   layers.Conv2D(128, kernel_size=[3, 3], padding="same", activation=tf.nn.relu),
   layers.MaxPool2D(pool_size=[2, 2], strides=2, padding='same'),

# unit 3
   layers.Conv2D(256, kernel_size=[3, 3], padding="same", activation=tf.nn.relu),
   layers.Conv2D(256, kernel_size=[3, 3], padding="same", activation=tf.nn.relu),
   layers.MaxPool2D(pool_size=[2, 2], strides=2, padding='same'),

# unit 4
   layers.Conv2D(512, kernel_size=[3, 3], padding="same", activation=tf.nn.relu),
   layers.Conv2D(512, kernel_size=[3, 3], padding="same", activation=tf.nn.relu),
   layers.MaxPool2D(pool_size=[2, 2], strides=2, padding='same'),

# unit 5
   layers.Conv2D(512, kernel_size=[3, 3], padding="same", activation=tf.nn.relu),
   layers.Conv2D(512, kernel_size=[3, 3], padding="same", activation=tf.nn.relu),
   layers.MaxPool2D(pool_size=[2, 2], strides=2, padding='same')

]

def preprocess(x, y):
   # [0~1]
   x = tf.cast(x, dtype=tf.float32) / 255.
   y = tf.cast(y, dtype=tf.int32)
   return x,y

(x,y), (x_test, y_test) = datasets.cifar100.load_data()
y = tf.squeeze(y, axis=1)
y_test = tf.squeeze(y_test, axis=1)
print(x.shape, y.shape, x_test.shape, y_test.shape)

train_db = tf.data.Dataset.from_tensor_slices((x,y))
train_db = train_db.shuffle(1000).map(preprocess).batch(128)

test_db = tf.data.Dataset.from_tensor_slices((x_test,y_test))
test_db = test_db.map(preprocess).batch(64)

sample = next(iter(train_db))
print('sample:', sample[0].shape, sample[1].shape,
     tf.reduce_min(sample[0]), tf.reduce_max(sample[0]))

def main():

# [b, 32, 32, 3] => [b, 1, 1, 512]
   conv_net = Sequential(conv_layers)

fc_net = Sequential([
       layers.Dense(256, activation=tf.nn.relu),
       layers.Dense(128, activation=tf.nn.relu),
       layers.Dense(100, activation=None),
   ])

conv_net.build(input_shape=[None, 32, 32, 3])
   fc_net.build(input_shape=[None, 512])
   optimizer = optimizers.Adam(lr=1e-4)

# [1, 2] + [3, 4] => [1, 2, 3, 4]
   variables = conv_net.trainable_variables + fc_net.trainable_variables

for epoch in range(50):

for step, (x,y) in enumerate(train_db):

with tf.GradientTape() as tape:
               # [b, 32, 32, 3] => [b, 1, 1, 512]
               out = conv_net(x)
               # flatten, => [b, 512]
               out = tf.reshape(out, [-1, 512])
               # [b, 512] => [b, 100]
               logits = fc_net(out)
               # [b] => [b, 100]
               y_onehot = tf.one_hot(y, depth=100)
               # compute loss
               loss = tf.losses.categorical_crossentropy(y_onehot, logits, from_logits=True)
               loss = tf.reduce_mean(loss)

grads = tape.gradient(loss, variables)
           optimizer.apply_gradients(zip(grads, variables))

if step %100 == 0:
               print(epoch, step, 'loss:', float(loss))

total_num = 0
       total_correct = 0
       for x,y in test_db:

out = conv_net(x)
           out = tf.reshape(out, [-1, 512])
           logits = fc_net(out)
           prob = tf.nn.softmax(logits, axis=1)
           pred = tf.argmax(prob, axis=1)
           pred = tf.cast(pred, dtype=tf.int32)

correct = tf.cast(tf.equal(pred, y), dtype=tf.int32)
           correct = tf.reduce_sum(correct)

total_num += x.shape[0]
           total_correct += int(correct)

acc = total_correct / total_num
       print(epoch, 'acc:', acc)

if __name__ == '__main__':
   main()

cnn+tensorflow实现识别图片

通过一个图像分类问题介绍卷积神经网络是如何工作的。下面是卷积神经网络判断一个图片是否包含“儿童”的过程,包括四个步骤:

● 图像输入(InputImage)

● 卷积(Convolution)

● 最大池化(MaxPooling)

● 全连接神经网络(Fully-ConnectedNeural Network)计算。

tensorflow2.0如何实现cnn的图像识别

首先将图片分割成如下图的重叠的独立小块;下图中,这张照片被分割成了77张大小相同的小图片。

tensorflow2.0如何实现cnn的图像识别

接下来将每一个独立小块输入小的神经网络;这个小的神经网络已经被训练用来判断一个图片是否属于“儿童”类别,它输出的是一个特征数组。

tensorflow2.0如何实现cnn的图像识别

标准的数码相机有红、绿、蓝三个通道(Channels),每一种颜色的像素值在0-255之间,构成三个堆叠的二维矩阵;灰度图像则只有一个通道,可以用一个二维矩阵来表示。

将所有的独立小块输入小的神经网络后,再将每一个输出的特征数组按照第一步时77个独立小块的相对位置做排布,得到一个新数组。

tensorflow2.0如何实现cnn的图像识别

第二步中,这个小的神经网络对这77张大小相同的小图片都进行同样的计算,也称权重共享(SharedWeights)。

这样做是因为,第一,对图像等数组数据来说,局部数组的值经常是高度相关的,可以形成容易被探测到的独特的局部特征;第二,图像和其它信号的局部统计特征与其位置是不太相关的,如果特征图能在图片的一个部分出现,也能出现在任何地方。

所以不同位置的单元共享同样的权重,并在数组的不同部分探测相同的模式。

数学上,这种由一个特征图执行的过滤操作是一个离散的卷积,卷积神经网络由此得名。

tensorflow2.0如何实现cnn的图像识别

卷积步骤完成后,再使用MaxPooling算法来缩减像素采样数组,按照2×2来分割特征矩阵,分出的每一个网格中只保留最大值数组,丢弃其它数组,得到最大池化数组(Max-PooledArray)。

接下来将最大池化数组作为另一个神经网络的输入,这个全连接神经网络会最终计算出此图是否符合预期的判断。

tensorflow2.0如何实现cnn的图像识别

在实际应用时,卷积、最大池化和全连接神经网络计算,这几步中的每一步都可以多次重复进行,总思路是将大图片不断压缩,直到输出单一的值。使用更多卷积步骤,神经网络就可以处理和学习更多的特征。

来源:https://blog.csdn.net/qq_38574975/article/details/107477846

标签:tensorflow2.0,cnn,图像识别
0
投稿

猜你喜欢

  • vue+elementui通用弹窗的实现(新增+编辑)

    2024-04-16 08:44:26
  • php session 预定义数组

    2023-11-15 01:15:22
  • 导入tensorflow:ImportError: libcublas.so.9.0 报错

    2023-07-07 11:44:46
  • SWFObject2.0: 基于Javascript的Flash媒体版本检测与嵌入模块

    2009-08-19 13:24:00
  • 高效测试用例组织算法pairwise之Python实现方法

    2021-07-22 01:09:49
  • 使用Python中PIL库给图片添加文本水印

    2021-09-07 19:09:52
  • java如何使用正则表达式限制特殊字符的个数

    2023-07-25 08:53:50
  • python实现将excel文件转化成CSV格式

    2021-10-16 05:23:50
  • python re模块匹配贪婪和非贪婪模式详解

    2023-04-19 01:44:16
  • Python3.5 Pandas模块之Series用法实例分析

    2022-07-23 16:19:09
  • 解决Python中回文数和质数的问题

    2021-03-07 02:51:23
  • Python中生成Epoch的方法

    2021-06-27 15:21:15
  • Python数据结构之栈详解

    2021-01-07 01:12:36
  • CSS中的标点符号用法

    2008-10-03 11:58:00
  • python神经网络编程之手写数字识别

    2022-01-12 20:50:04
  • aws 通过boto3 python脚本打pach的实现方法

    2021-09-14 23:33:19
  • python实现批量转换文件编码(批转换编码示例)

    2023-07-28 22:03:47
  • String.indexOf 方法介绍

    2013-06-01 20:22:27
  • mysql中limit的用法深入分析

    2024-01-21 17:28:17
  • 关于Python Socket编程的要点详解

    2021-11-25 17:44:11
  • asp之家 网络编程 m.aspxhome.com