zoukankan      html  css  js  c++  java
  • TensorFlow2_200729系列---23、卷积神经网络实例

    TensorFlow2_200729系列---23、卷积神经网络实例

    一、总结

    一句话总结:

    A、layers.Conv2D(64, kernel_size=[3, 3], padding="same", activation=tf.nn.relu),
    B、layers.Conv2D(64, kernel_size=[3, 3], padding="same", activation=tf.nn.relu),
    C、layers.MaxPool2D(pool_size=[2, 2], strides=2, padding='same'),

    二、卷积神经网络实例

    博客对应课程的视频位置:

    import  os
    os.environ['TF_CPP_MIN_LOG_LEVEL']='2'
    
    import  tensorflow as tf
    from    tensorflow.keras import layers, optimizers, datasets, Sequential
    
    tf.random.set_seed(2345)
    
    # 卷积层
    conv_layers = [ # 5 units of conv + max pooling
        # 5个单元
        # unit 1
        layers.Conv2D(64, kernel_size=[3, 3], padding="same", activation=tf.nn.relu),
        layers.Conv2D(64, kernel_size=[3, 3], padding="same", activation=tf.nn.relu),
        layers.MaxPool2D(pool_size=[2, 2], strides=2, padding='same'),
    
        # unit 2
        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'),
    
        # unit 3
        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'),
    
        # unit 4
        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'),
    
        # unit 5
        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')
    
    ]
    
    
    # 归一化处理
    def preprocess(x, y):
        # [0~1]
        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()
    # 挤压
    y = tf.squeeze(y, axis=1)
    y_test = tf.squeeze(y_test, axis=1)
    print(x.shape, y.shape, x_test.shape, y_test.shape)
    
    # 训练数据
    train_db = tf.data.Dataset.from_tensor_slices((x,y))
    train_db = train_db.shuffle(1000).map(preprocess).batch(128)
    
    # 测试数据
    test_db = tf.data.Dataset.from_tensor_slices((x_test,y_test))
    test_db = test_db.map(preprocess).batch(64)
    
    # 数据样例
    sample = next(iter(train_db))
    print('sample:', sample[0].shape, sample[1].shape,
          tf.reduce_min(sample[0]), tf.reduce_max(sample[0]))
    
    
    def main():
    
        # 卷积层
        # [b, 32, 32, 3] => [b, 1, 1, 512]
        conv_net = Sequential(conv_layers)
    
        # 全连接层
        fc_net = Sequential([
            layers.Dense(256, activation=tf.nn.relu),
            layers.Dense(128, activation=tf.nn.relu),
            # 100个分类,输出
            layers.Dense(100, activation=None),
        ])
    
        # 卷积层网络构建
        conv_net.build(input_shape=[None, 32, 32, 3])
        # 全连接网络构建
        fc_net.build(input_shape=[None, 512])
        # 优化函数
        optimizer = optimizers.Adam(lr=1e-4)
    
        # [1, 2] + [3, 4] => [1, 2, 3, 4]
        # 所有的参数就是 卷积层的参数 和 全连接层的参数
        variables = conv_net.trainable_variables + fc_net.trainable_variables
    
        for epoch in range(50):
    
            for step, (x,y) in enumerate(train_db):
    
                with tf.GradientTape() as tape:
                    # 卷积层
                    # [b, 32, 32, 3] => [b, 1, 1, 512]
                    out = conv_net(x)
                    # reshape方便全连接层用
                    # flatten, => [b, 512]
                    out = tf.reshape(out, [-1, 512])
                    # 全连接层
                    # [b, 512] => [b, 100]
                    logits = fc_net(out)
                    # [b] => [b, 100]
                    y_onehot = tf.one_hot(y, depth=100)
                    # compute loss:crossentropy
                    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))
    
    
    
            total_num = 0
            total_correct = 0
            for x,y in test_db:
    
                out = conv_net(x)
                out = tf.reshape(out, [-1, 512])
                logits = fc_net(out)
                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)
    
                total_num += x.shape[0]
                total_correct += int(correct)
    
            acc = total_correct / total_num
            print(epoch, 'acc:', acc)
    
    
    
    if __name__ == '__main__':
        main()
     
    我的旨在学过的东西不再忘记(主要使用艾宾浩斯遗忘曲线算法及其它智能学习复习算法)的偏公益性质的完全免费的编程视频学习网站: fanrenyi.com;有各种前端、后端、算法、大数据、人工智能等课程。
    博主25岁,前端后端算法大数据人工智能都有兴趣。
    大家有啥都可以加博主联系方式(qq404006308,微信fan404006308)互相交流。工作、生活、心境,可以互相启迪。
    聊技术,交朋友,修心境,qq404006308,微信fan404006308
    26岁,真心找女朋友,非诚勿扰,微信fan404006308,qq404006308
    人工智能群:939687837

    作者相关推荐

  • 相关阅读:
    【python3的进阶之路一】正则表达式
    基础编程练习50道
    【python3的学习之路十四】IO编程
    【python3的学习之路十三】错误和调试
    【python3的学习之路十二】面向对象高级编程
    【python3的学习之路十一】面向对象编程
    jQuery之防止冒泡事件,冒泡事件就是点击子节点,会向上触发父节点,祖先节点的点击事件。
    手机移动端WEB资源整合
    js 验证表单 js提交验证类
    js单条新闻向上滚动
  • 原文地址:https://www.cnblogs.com/Renyi-Fan/p/13451974.html
Copyright © 2011-2022 走看看