TensorFlow知识点记录

本文介绍如何使用TensorFlow处理jpeg图片的4通道问题,通过创建Alpha通道并将其与原图融合,然后构建了一个轻量级的MNIST模型。讲解了模型构建、训练、评估以及权重保存与加载的方法,重点在于简化网络结构和参数管理。
摘要由CSDN通过智能技术生成

jpeg图片读入后为4通道,转3通道可用此方法

import tensorflow as tf
Alpha_channel = tf.fill([img.shape[0], img.shape[1], 1], 128.0)         # 创建一个元素全为128的张量
Alpha_channel = Alpha_channel/255.0         # 归一化后元素值为0.5
four_channel_img = tf.concat([float_img, Alpha_channel], 2)     # 将0.5倍透明通道合并到原图
print(four_channel_img.shape)
show_pic(four_channel_img)
# 剔除新增的透明通道
four_channel_img[:, :, :3].shape

模型构建流程

import tensorflow as tf
import tensorflow.keras as keras
(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()
x_train, x_test = x_train/255.0, x_test/255.0
# 网络设计
inputs = keras.layers.Input(shape=(28, 28))
x = keras.layers.Flatten()(inputs)
x = keras.layers.Dense(128, activation='relu')(x)
x = keras.layers.Dense(64, activation='relu')(x)
x = keras.layers.Dropout(0.2)(x)
outputs = keras.layers.Dense(10, activation='softmax')(x)
model = keras.Model(inputs=inputs, outputs=outputs)

model.compile(
        optimizer='Adam',       # 选择Adam优化器
        loss='sparse_categorical_crossentropy', # 选择sparse_categorical_crossentropy损失函数
        metrics=['accuracy']   # 选择sparse_categorical_accuracy评测指标
              )
a = model.fit(x_train, y_train, batch_size=32, epochs=5, validation_data=(x_test, y_test), validation_freq=1)

打印训练记录

a.history

模型测试

test_scores = model.evaluate(x_test, y_test)
print("test loss:", test_scores[0])
print("test accuracy:", test_scores[1])

模型的保存与加载

张量的方式

# 网络的状态主要体现在网络的结构以及网络层内部张量参数上,因此在拥有网络结构源文件的条件下,直接保存网络张量参数到文件上是最轻量级的一种方式。我们以MNIST 手写数字图片识别模型为例,通过调用Model.save_weights(path)方法就可以将当前的网络参数保存到path 文件上:
model.save_weights(r"D:\study\tensorflow官网教程\weights.ckpt")
# 加载
# 重新创建相同的网络结构
inputs = keras.layers.Input(shape=(28, 28))
x = keras.layers.Flatten()(inputs)
x = keras.layers.Dense(128, activation='relu')(x)
x = keras.layers.Dense(64, activation='relu')(x)
x = keras.layers.Dropout(0.2)(x)
outputs = keras.layers.Dense(10, activation='softmax')(x)
model = keras.Model(inputs=inputs, outputs=outputs)

model.compile(
        optimizer='Adam',       # 选择Adam优化器
        loss='sparse_categorical_crossentropy', # 选择sparse_categorical_crossentropy损失函数
        metrics=['accuracy']   # 选择sparse_categorical_accuracy评测指标
              )
model.load_weights(r"D:\study\tensorflow官网教程\weights.ckpt")
# 这种保存与加载网络的方式最为轻量级,文件中保存的仅仅是参数张量的数值,并没有其他额外的结构参数。但是它需要使用相同的网络结构才能够恢复网络状态,因此一般在拥有网络源文件的情况下使用。

网络方式

# 通过Model.save(path)函数可以将模型的结构以及模型的参数保存到一个path 文件上,在不需要网络源文件的条件下,通过keras.models.load_model(path)即可恢复网络结构和网络参数。
model.save(r"D:\study\tensorflow官网教程\weights.h5")
# 加载
net = tf.keras.models.load_model(r"D:\study\tensorflow官网教程\weights.h5")
net.summary()
# 可以看到,model.h5 文件除了保存了模型参数外,还保存了网络结构信息,不需要提前创 建模型即可直接从文件 恢复出网络 net对象。

加载tensorflow.keras.applications子模块下的经典模型

加载模型

# 以 ResNet50 迁移学习为例,一般将 ResNet50 去掉最后一层后的网络作为新任务的特 征提取子网络,即利用 ImageNet 上面预训练的特征提取方法迁移到我们自定义的数据集 上,并根据自定义任务的类别追加一个对应数据类别数的全连接分类层,从而可以在预训 练网络的基础上可以快速、高效地学习新任务。首先利用 Keras 模型乐园加载 ImageNet 预训练的ResNet50网络:
import tensorflow as tf
from tensorflow import keras
# 加载ImageNet预训练网络模型,并去掉最后一层
resnet = keras.applications.ResNet50(weights='imagenet', include_top=False)
resnet.summary()
# weights指定加载已训练好的权重

通过自定义输入张量构建InceptionV3

from tensorflow.keras.applications import InceptionV3
from tensorflow.keras.layers import Input
# 构建自定义输入层
inputs = Input(shape=(224,224,3))
# 加载inceptionV3预训练模型,并指定自定义输入层
model = InceptionV3(input_tensor=inputs, weights='imagenet', include_top=True)
model.summary()

从VGG19的任意中间层抽取特征

from tensorflow.keras.applications import VGG19
from tensorflow.keras.models import Model
base_model = VGG19(weights='imagenet')
model = Model(inputs=base_model.input, outputs=base_model.get_layer('blocak4_pool').outputs)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宿夏星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值