zoukankan      html  css  js  c++  java
  • TF2 可视化Loss函数,并且导出模型图

    pip安装依赖pydotgraphviz并且安装软件sudo apt install graphviz,有个坑,windows安装软件之后安装的依赖是pydot-ng

    注意:模型的第一层需要把形状传进去

    import os
    os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
    import datetime
    
    import tensorflow as tf
    import numpy as np
    from tensorflow import keras
    from tensorflow.keras import datasets, layers, optimizers, Sequential, metrics
    from tensorflow.keras.utils import plot_model
    
    conv_layers = [
        layers.Conv2D(64, kernel_size=[3, 3], padding='same', activation=tf.nn.relu, input_shape=[32, 32, 3]),
        layers.Conv2D(64, kernel_size=[3, 3], padding='same', activation=tf.nn.relu),
        layers.MaxPool2D(pool_size=[2, 2], strides=2, padding='same'),
    
        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'),
    
        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'),
    
        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'),
    
        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'),
    
        layers.Flatten(),
    
        layers.Dense(256, activation=tf.nn.relu),
        layers.Dense(128, activation=tf.nn.relu),
        layers.Dense(100, activation=None),
    ]
    
    def preprocess(x, y):
        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()
    # (50000, 32, 32, 3) (50000, 1) (10000, 32, 32, 3) (10000, 1)
    y = tf.squeeze(y, axis=1)
    y_test = tf.squeeze(y_test, axis=1)
    
    train_db = tf.data.Dataset.from_tensor_slices((x, y))
    train_db = train_db.shuffle(1000).map(preprocess).batch(64)
    
    test_db = tf.data.Dataset.from_tensor_slices((x_test, y_test))
    test_db = test_db.map(preprocess).batch(64)
    
    
    logdir = "logs/" + datetime.datetime.now().strftime("%Y%m%d-%H%M%S")
    writer = tf.summary.create_file_writer(logdir=logdir)
    
    def main():
        model = Sequential(conv_layers)
        model.summary()
        plot_model(model=model, to_file="model.png", show_shapes=True, dpi=300)
    
    
        variables = model.trainable_variables
        optimizer = optimizers.Adam(lr=1e-4)
    
        for epoch in range(10):
            for step, (x, y) in enumerate(train_db):
                with tf.GradientTape() as tape:
                    logits = model(x)
                    y_onehot = tf.one_hot(y, depth=100)
                    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))
    
            with writer.as_default():
                tf.summary.scalar("train_loss", loss, epoch)
    
    
            totol_num = 0
            totol_correct = 0
            for x, y in test_db:
                logits = model(x)
                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)
                totol_num += x.shape[0]
                totol_correct += int(correct)
    
            acc = totol_correct / totol_num
            print(epoch, 'acc:', acc)
    
            with writer.as_default():
                tf.summary.scalar("val_acc", acc, epoch)
    
    
    if __name__ == '__main__':
        main()
    
  • 相关阅读:
    ubuntu给手机建wifi
    UTF-8编码的字符串拆分成单字、获取UTF-8字符串的字符个数的代码及原理(c++实现)
    Android 获取WIFI MAC地址的方法
    【美妙的Python之二】Python初步
    LCD深度剖析
    Eclipse断点调试
    Draw2d中的布局管理器Layout比较
    Java实现 蓝桥杯VIP 算法训练 输出米字形
    Java实现 蓝桥杯VIP 算法训练 输出米字形
    Java实现 蓝桥杯VIP 算法训练 斜率计算
  • 原文地址:https://www.cnblogs.com/consolexinhun/p/14292935.html
Copyright © 2011-2022 走看看