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)
相关推荐
BullSmall17 分钟前
汽车HIL测试:电子开发的关键验证环节
人工智能·机器学习·自动驾驶
woshihonghonga18 分钟前
停止Conda开机自动运行方法
linux·人工智能·conda
海洲探索-Hydrovo2 小时前
TTP Aether X 天通透传模块丨国产自主可控大数据双向通讯定位模组
网络·人工智能·科技·算法·信息与通信
触想工业平板电脑一体机2 小时前
【触想智能】工业安卓一体机在人工智能领域上的市场应用分析
android·人工智能·智能电视
墨染天姬4 小时前
【AI】数学基础之矩阵
人工智能·线性代数·矩阵
2401_841495645 小时前
【计算机视觉】基于复杂环境下的车牌识别
人工智能·python·算法·计算机视觉·去噪·车牌识别·字符识别
倔强青铜三6 小时前
苦练Python第66天:文件操作终极武器!shutil模块完全指南
人工智能·python·面试
倔强青铜三6 小时前
苦练Python第65天:CPU密集型任务救星!多进程multiprocessing模块实战解析,攻破GIL限制!
人工智能·python·面试
强哥之神6 小时前
浅谈目前主流的LLM软件技术栈:Kubernetes + Ray + PyTorch + vLLM 的协同架构
人工智能·语言模型·自然语言处理·transformer·openai·ray
zskj_qcxjqr6 小时前
七彩喜艾灸机器人:当千年中医智慧遇上现代科技
大数据·人工智能·科技·机器人