Tensorflow2学习卷积神经网络入门

前言

前面写了篇入门的文章Tensorflow2学习之MNIST数据训练和测试,这里的demo属于全连接网络(FCN)。还有一种是卷积网络(CNN)相比较与全连接网络在很多方面都有优势。深入点的理论我是不懂的,这里只说点我能理解的。

  1. 由于CNN是基于卷积核的FCN基于像素点的。所以在某些应用场景中减少参数实现效率(卷积运算)、降低局部特征点影响(局部相关)、降低图像变换的影响、权值共享有很大优势的。
  2. FCN在做图像分割深度学习技术都是基于它实现的网络结构,比如 U-Net。
  3. CNN在做图像分类、目标检测方面的实现效果是非常出色的。

失传已久的记忆 平时矩阵相乘@

  1. <math xmlns="http://www.w3.org/1998/Math/MathML"> A ∗ B A*B </math>A∗B A列数要和B行数相同
  2. <math xmlns="http://www.w3.org/1998/Math/MathML"> 1 ∗ 1 + 3 ∗ 0 + 2 ∗ 5 = 11 1*1+3*0+2*5=11 </math>1∗1+3∗0+2∗5=11
  3. <math xmlns="http://www.w3.org/1998/Math/MathML"> 4 ∗ 1 + 0 ∗ 0 + 1 ∗ 5 = 9 4*1+0*0+1*5=9 </math>4∗1+0∗0+1∗5=9

卷积的矩阵相乘

1.卷积矩阵的对应元素相乘,⨀符号表示哈达马积(Hadamard Product)

  1. 通过设置参数 padding='SAME'、strides=1 可以直接得到输入、输出同大小的
  2. 卷积层,其中 padding 的具体数量由 TensorFlow 自动计算并完成填充操作
  3. 当s > 1 时,设置 padding='SAME'将使得输出高、宽将成1/s倍地减少。
  4. out = tf.nn.conv2d(x,w,strides=1,padding=[[0,0],[0,0],[0,0],[0,0]])
  5. padding=[[0,0],[上,下],[左,右],[0,0]]

卷积网络

Conv2D卷积操作 注意下输入input_shape=(32, 32, 3)需要调整

ini 复制代码
model = models.Sequential()
model.add(
(64, (3, 3), activation='relu', padding='same', input_shape=(32, 32, 3), kernel_regularizer=regularizers.l2(weight_decay)))
model.add(Conv2D(64, (3, 3), activation='relu', padding='same', kernel_regularizer=regularizers.l2(weight_decay)))
model.add(MaxPooling2D((2, 2)))

经典的卷积网络有AlexNet、VGG、GoogLeNet

VGG16直接引用的写法。或者自己写网络模型
  1. 注意下最后输出 这里激活函数用了sigmoid做猫狗的测试。上一次我们对于手写字体用了分类为10的msoftmax。关于激活函数网上可以自己了解下。
  2. model.add(keras.layers.Dense(11, activation='softmax')) # 多分类输出一般用softmax分类器
  3. 下面为VGG模型微调,如不需要微调,则可将conv_base.trainable设置为FALSE
ini 复制代码
def VGG16_for_tf():  # 设置函数来创建模型
    model = models.Sequential()
    # 使用VGG16作为模型的基本框架,加载在ImageNet上训练的权重,并去除输出层
    base_model = tf.keras.applications.VGG16(include_top=False, weights='imagenet', input_shape=(224, 224, 3))
    base_model.trainable = False # 冻结VGG16的权重,只训练输出层
    model.add(base_model)
    model.add(Flatten())
    model.add(Dense(1, activation='sigmoid'))  # 二分类,使用sigmoid映射到[0.0,1.0]
    return model
数据加载

再次提下在前面介绍Tensorflow2学习之MNIST数据训练和测试的时候注意训练用了history = model.fit(x_train, y_train_onehot, epochs=20)分别指定了训练的数据和对应的标签,这里学到了一个新的方法不用再辛苦处理单独拼接提取数据了,主要是语法和方法的封装吧。 这里的模型测试和前面一样用的h5,后面会试下tf模型

python 复制代码
train_image_path = glob.glob(r'dogs-vs-cats\train**.jpg')  # 猫狗数据集存放路径
train_image_label = [int(os.path.basename(p).split('.')[0] == 'cat') for p in train_image_path]  # 文件名字,并编码,cat为1,dog为0
train_image_ds = tf.data.Dataset.from_tensor_slices((train_image_path, train_image_label))
train_image_ds = train_image_ds.map(load_preprocess_image, num_parallel_calls=AUTOTUNE)
#打乱随机提取大小
train_image_ds = train_image_ds.shuffle(train_count).batch(BATCH_SIZE)
相关推荐
被制作时长两年半的个人练习生5 分钟前
【pytorch】权重为0的情况
人工智能·pytorch·深度学习
Elastic 中国社区官方博客20 分钟前
使用 Vertex AI Gemini 模型和 Elasticsearch Playground 快速创建 RAG 应用程序
大数据·人工智能·elasticsearch·搜索引擎·全文检索
说私域1 小时前
地理定位营销与开源AI智能名片O2O商城小程序的融合与发展
人工智能·小程序
Q_w77421 小时前
计算机视觉小目标检测模型
人工智能·目标检测·计算机视觉
创意锦囊1 小时前
ChatGPT推出Canvas功能
人工智能·chatgpt
知来者逆1 小时前
V3D——从单一图像生成 3D 物体
人工智能·计算机视觉·3d·图像生成
碳苯2 小时前
【rCore OS 开源操作系统】Rust 枚举与模式匹配
开发语言·人工智能·后端·rust·操作系统·os
努力的小雨2 小时前
从零开始学机器学习——网络应用
机器学习
whaosoft-1433 小时前
51c视觉~CV~合集3
人工智能
网络研究院4 小时前
如何安全地大规模部署 GenAI 应用程序
网络·人工智能·安全·ai·部署·观点