tensorflow2.0—笔记4 自定义网络、模型保存与加载 原创

1191-杨同学

发表文章数:32

首页 » 算法 » 正文

Keras.Metrics

tensorflow2.0---笔记4 自定义网络、模型保存与加载                    原创
tensorflow2.0---笔记4 自定义网络、模型保存与加载                    原创
tensorflow2.0---笔记4 自定义网络、模型保存与加载                    原创
tensorflow2.0---笔记4 自定义网络、模型保存与加载                    原创
tensorflow2.0---笔记4 自定义网络、模型保存与加载                    原创
tensorflow2.0---笔记4 自定义网络、模型保存与加载                    原创
tensorflow2.0---笔记4 自定义网络、模型保存与加载                    原创
tensorflow2.0---笔记4 自定义网络、模型保存与加载                    原创
tensorflow2.0---笔记4 自定义网络、模型保存与加载                    原创

compile & fit

tensorflow2.0---笔记4 自定义网络、模型保存与加载                    原创
以前
tensorflow2.0---笔记4 自定义网络、模型保存与加载                    原创
tensorflow2.0---笔记4 自定义网络、模型保存与加载                    原创
now

tensorflow2.0---笔记4 自定义网络、模型保存与加载                    原创
tensorflow2.0---笔记4 自定义网络、模型保存与加载                    原创
network.fit里面validation是为了提前停止;network.evaluate 验证模型最终准确率。
tensorflow2.0---笔记4 自定义网络、模型保存与加载                    原创

自定义层/网络

tensorflow2.0---笔记4 自定义网络、模型保存与加载                    原创

keras.Sequential

tensorflow2.0---笔记4 自定义网络、模型保存与加载                    原创
注意,netwok = Sequential() 这一步并没有创建w、b,在network.build() 指定输入维度,或者直接 network(x) 之后才生成w、b。
network.summary() 可查看网络结构。
tensorflow2.0---笔记4 自定义网络、模型保存与加载                    原创
tensorflow2.0---笔记4 自定义网络、模型保存与加载                    原创

自定义层

必须继承自keras.layers.Layer
tensorflow2.0---笔记4 自定义网络、模型保存与加载                    原创

自定义网络

必须继承自keras.Model
tensorflow2.0---笔记4 自定义网络、模型保存与加载                    原创

模型保存与加载

tensorflow2.0---笔记4 自定义网络、模型保存与加载                    原创
tensorflow2.0---笔记4 自定义网络、模型保存与加载                    原创

tensorflow2.0---笔记4 自定义网络、模型保存与加载                    原创
tensorflow2.0---笔记4 自定义网络、模型保存与加载                    原创
tensorflow2.0---笔记4 自定义网络、模型保存与加载                    原创
tensorflow2.0---笔记4 自定义网络、模型保存与加载                    原创

实战

tensorflow2.0---笔记4 自定义网络、模型保存与加载                    原创
tensorflow2.0---笔记4 自定义网络、模型保存与加载                    原创

import tensorflow as tf
import numpy as np

a = np.ones([10, 1])
print(type(a))  # <class 'numpy.ndarray'>
a = tf.squeeze(a)
print(type(a))  # <class 'tensorflow.python.framework.ops.EagerTensor'>
print(a.shape)  # (10,)

a = np.ones([10, 1])

a = tf.expand_dims(a, -1)
print(type(a))  # <class 'tensorflow.python.framework.ops.EagerTensor'>
print(a.shape)  # (10, 1, 1)
print(a.dtype)  # <dtype: 'float64'>

貌似对tensor的操作也可用于numpy类型
实战代码:

import tensorflow as tf
from tensorflow import keras
import os

os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'


def preprocessing(x, y):
    """
    x is a single image, not a batch of images
    x、y已经是tensor类型
    """
    x = tf.cast(x, dtype=tf.float32) / 255.   #
    y = tf.cast(y, dtype=tf.int32)
    return x, y


# 自定义层(类) ,需要继承自keras.layers.Layer
class MyDense(keras.layers.Layer):
    def __init__(self, inp_shape, outp_shape):
        super(MyDense, self).__init__()
        self.kernel = self.add_variable('w', [inp_shape, outp_shape])
        self.bias = self.add_variable('b', [outp_shape])

    def call(self, inputs, training=None):
        x = inputs @ self.kernel + self.bias
        return x


# 自定义网络需要继承自keras.Model
class MyNetwork(keras.Model):
    def __init__(self):
        super(MyNetwork, self).__init__()
        self.fc1 = MyDense(32*32*3, 256)
        self.fc2 = MyDense(256, 128)
        self.fc3 = MyDense(128, 64)
        self.fc4 = MyDense(64, 32)
        self.fc5 = MyDense(32, 10)

    def __call__(self, inputs, training=None):

        # inputs:[b, 32, 32, 3]
        x = tf.reshape(inputs, [-1, 32*32*3])
        x = self.fc1(x)
        x = tf.nn.relu(x)
        x = self.fc2(x)
        x = tf.nn.relu(x)
        x = self.fc3(x)
        x = tf.nn.relu(x)
        x = self.fc4(x)
        x = tf.nn.relu(x)
        x = self.fc5(x)

        return x


def main():

    # 数据加载和预处理
    (x_train, y_train), (x_test, y_test) = keras.datasets.cifar10.load_data()
    # print(y_train.shape)  (50000, 1)
    # print(tf.is_tensor(x_train))  False

    y_train = tf.squeeze(y_train)  # 对numpy操作,返回tensor类型
    y_train = tf.one_hot(y_train, depth=10)

    y_test = tf.squeeze(y_test)
    y_test = tf.one_hot(y_test, depth=10)
    print(y_test.shape)

    train_db = tf.data.Dataset.from_tensor_slices((x_train, y_train))  # 此时x、y已经由numpy类型转换成tensor类型
    train_db = train_db.map(preprocessing).shuffle(10000).batch(256)  # .map 括号里 只需写函数名

    test_db = tf.data.Dataset.from_tensor_slices((x_test, y_test))
    test_db = test_db.map(preprocessing).batch(256)

    network = MyNetwork()
    network.compile(optimizer=keras.optimizers.Adam(lr=1e-3),
                    loss=tf.losses.CategoricalCrossentropy(from_logits=True),
                    metrics=['accuracy'])
    network.fit(train_db, epochs=15, validation_data=test_db, validation_freq=1)
    network.evaluate(test_db)
     # 模型保存与加载
    network.save_weights('./weights.ckpt')
    del network
    print("saved")

    network = MyNetwork()
    network.compile(optimizer=keras.optimizers.Adam(lr=1e-3),
                    loss=tf.losses.CategoricalCrossentropy(from_logits=True),
                    metrics=['accuracy'])
    network.load_weights('./weights.ckpt')
    print('loaded')


if __name__ == '__main__':
    main()

tensorflow2.0---笔记4 自定义网络、模型保存与加载                    原创

拜师教育学员文章:作者:1191-杨同学, 转载或复制请以 超链接形式 并注明出处 拜师资源博客
原文地址:《tensorflow2.0—笔记4 自定义网络、模型保存与加载 原创》 发布于2020-09-18

分享到:
赞(0) 打赏

评论 抢沙发

评论前必须登录!

  注册



长按图片转发给朋友

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

Vieu3.3主题
专业打造轻量级个人企业风格博客主题!专注于前端开发,全站响应式布局自适应模板。

登录

忘记密码 ?

您也可以使用第三方帐号快捷登录

Q Q 登 录
微 博 登 录