八. airplane,lake图像分类

import tensorflow as tf
import numpy as np
import glob#glob是python自带的一个操作文件的相关模块
import random

def load_image(path):
    image = tf.io.read_file(path)
    image = tf.image.decode_jpeg(image,channels=3)#jpg,png,gif....经过压缩编码,所以读取之后要解码还原成一个三维矩阵
    image = tf.image.resize(image,[256,256])#统一尺寸256*256
    #image = tf.cast(image, tf.float32)  # uint8变为float32
    image = image/255.0
    return image

if __name__ == '__main__':
    all_image_path = glob.glob('2_class/*/*.jpg')
    #['2_class\\airplane\\airplane_001.jpg', '2_class\\airplane\\airplane_002.jpg', ''''']读取图像路径
    random.shuffle(all_image_path)
    label_to_index = {
        'airplane':0,
        'lake':1
    }
    all_labels = all_image_path[10].split("\\")[-1].split("_")[0]#airplane或lake

    all_labels = [label_to_index.get(
        i.split("\\")[-1].split("_")[0])
        for i in all_image_path
    ]
    #all_labels: [0, 1, 0, 0, 0, 0, 0, 1, 0,'''''']
    img_ds = tf.data.Dataset.from_tensor_slices(all_image_path)
    img_ds = img_ds.map(load_image)#<MapDataset shapes: (256, 256, 3), types: tf.float32>
    label_ds = tf.data.Dataset.from_tensor_slices(all_labels)
    img_label_ds = tf.data.Dataset.zip((img_ds,label_ds))#<ZipDataset shapes: ((256, 256, 3), ()), types: (tf.float32, tf.int32)>
    image_count = len(all_image_path)
    test_count = int(image_count*0.2)
    train_count = image_count - test_count#训练集数量
    train_ds = img_label_ds.skip(test_count)#跳过前面
    test_ds = img_label_ds.take(test_count)#取前面
    train_ds = train_ds.repeat().shuffle(100).batch(16)#100大小的缓存区乱序,<SkipDataset shapes: ((256, 256, 3), ()), types: (tf.float32, tf.int32)>
    test_ds = test_ds.batch(16)
    print(train_ds)



    model = tf.keras.Sequential()
    model.add(tf.keras.layers.Conv2D(64,(3,3),input_shape=(256,256,3),padding='same',activation='relu'))
    model.add(tf.keras.layers.BatchNormalization())#批标准化
    model.add(tf.keras.layers.Conv2D(64,(3,3),activation='relu'))
    model.add(tf.keras.layers.BatchNormalization())
    model.add(tf.keras.layers.MaxPooling2D())
    model.add(tf.keras.layers.Conv2D(128,(3,3),activation='relu'))
    model.add(tf.keras.layers.BatchNormalization())
    model.add(tf.keras.layers.Conv2D(128,(3,3),activation='relu'))
    model.add(tf.keras.layers.BatchNormalization())
    model.add(tf.keras.layers.MaxPooling2D())
    model.add(tf.keras.layers.Conv2D(256,(3,3),activation='relu'))
    model.add(tf.keras.layers.BatchNormalization())
    model.add(tf.keras.layers.Conv2D(256,(3,3),activation='relu'))
    model.add(tf.keras.layers.BatchNormalization())
    model.add(tf.keras.layers.MaxPooling2D())
    model.add(tf.keras.layers.Conv2D(512, (3, 3),activation='relu'))
    model.add(tf.keras.layers.BatchNormalization())
    model.add(tf.keras.layers.Conv2D(512, (3, 3),activation='relu'))
    model.add(tf.keras.layers.BatchNormalization())
    model.add(tf.keras.layers.MaxPooling2D())
    model.add(tf.keras.layers.Conv2D(512, (3, 3),activation='relu'))
    model.add(tf.keras.layers.BatchNormalization())
    model.add(tf.keras.layers.Conv2D(512, (3, 3),activation='relu'))
    model.add(tf.keras.layers.BatchNormalization())
    model.add(tf.keras.layers.Conv2D(512, (3, 3),activation='relu'))
    model.add(tf.keras.layers.BatchNormalization())
    model.add(tf.keras.layers.GlobalAveragePooling2D())
    model.add(tf.keras.layers.Dense(1024,activation='relu'))
    model.add(tf.keras.layers.BatchNormalization())
    model.add(tf.keras.layers.Dense(256, activation='relu'))
    model.add(tf.keras.layers.BatchNormalization())
    model.add(tf.keras.layers.Dense(1, activation='sigmoid'))
    model.add(tf.keras.layers.BatchNormalization())

    model.compile(
        optimizer=tf.keras.optimizers.Adam(0.0001),
        loss=tf.keras.losses.BinaryCrossentropy(),#BinaryCrossentropy 函数
        metrics=['acc']
    )
    history = model.fit(
        train_ds,
        epochs=10,
        steps_per_epoch=train_count//16,
        validation_data=test_ds,
        validation_steps=test_count//16
    )
    print(history)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值