利用kaggle提供的免费GPU完成卫星图片识别任务

利用kaggle提供的免费GPU完成卫星图片识别任务

文章目录

  • 利用kaggle提供的免费GPU完成卫星图片识别任务
    • 1.数据集的介绍
    • 2.将数据集上传到kaggle
    • 3.利用tf.data构造输入
    • 4.模型的创建与配置
    • 5.下载模型在本地导入并用于预测
  • 结语

1.数据集的介绍

该数据集提供了,两类图片,飞机airplane,和湖(lake),是属于一个二分类的问题,同时提供的数据都为彩色图,RGB三通道,大小为2562563,对于这样典型的二分类问题,我们想要建立模型去识别他到底是飞机还是湖

利用kaggle提供的免费GPU完成卫星图片识别任务_第1张图片

利用kaggle提供的免费GPU完成卫星图片识别任务_第2张图片

2.将数据集上传到kaggle

kaggle每周至少提供三十个小时的免费GPU(使用GPU相对于CPU学习模型会大大加速训练时间),对于学习深度学习,跑小模型是绰绰有余的,kaggle支持用户上传并使用自己个人的数据集(可以上传压缩包,我上传的zip他自动解压了),而且对于训练好输出的也可以下载回来,所以我们可以放心的在上面运行我们的模型,那么我们在注册登录kaggle之后只需要在data模块中按照他所说的上传自己的数据集。

利用kaggle提供的免费GPU完成卫星图片识别任务_第3张图片

然后在构造的notbook中,我们选择添加数据集即可,然后在点击右侧,可以复制图片地址,我们就可以读取图片了。

利用kaggle提供的免费GPU完成卫星图片识别任务_第4张图片

3.利用tf.data构造输入

​ 在我的上节博客,我介绍了如何利用tf.data来构造输入,现在我们来对更为复杂的数据进行构造。

​ 首先,我们知道读取每张图片之前一定要知道每张图片的地址,他也就是我们最好是要获得所有图片的地址,在python中,我们可以使用glob库,来读取

from tensorflow import keras
import matplotlib.pyplot as plt
%matplotlib inline
import numpy as np
import glob
all_image_path = glob.glob('../input/weixing/2_class/*/*.jpg')
#这个地址是在kaggle上我上传的数据集的地址
#使用这个等于匹配2_class子文件中所有后缀为.jpg的文件
#返回一个列表中包含所有图片的地址
import random 
#为了让模型不知学习一个类型(因为在处理中,前面所有的类型在一起)
#所以我们要对整个数据集进行乱序
random.shuffle(all_image_path)
all_image_path[:5]
#乱序后输出是这样的
['2_class\\airplane\\airplane_110.jpg',
 '2_class\\airplane\\airplane_608.jpg',
 '2_class\\airplane\\airplane_596.jpg',
 '2_class\\airplane\\airplane_536.jpg',
 '2_class\\lake\\lake_546.jpg']

这样我们就获得了所有图片的地址接下来我们建立 读取图片并处理的函数:

def load_img(path):
    img=tf.io.read_file(path)
    #用io读取后img其实是一个二进制文件,我们还要解码
    img=tf.image.decode_jpeg(img,channels=3)
    #解码每种格式都有对应的函数,这里我们图片是jpg,我们选择该函数
    img=tf.image.resize(img,[256,256])
    img=tf.cast(img,tf.float32)
    img=img/255.0
    #对图片进行处理
    return img

接下来,我们制作输入的dataset


img_ds=tf.data.Dataset.from_tensor_slices(all_image_path)
label_ds=tf.data.Dataset.from_tensor_slices(all_labels)
#整个数据的压制就完成了,接下来为了完成任务,我们还需要划分测试与训练集
data=tf.data.Dataset.zip((img_ds,label_ds))
#将测试集的20%划分为测试集
data_nums=len(all_image_path)
test_nums=int(data_nums*0.2)
train_nums=data_nums-test_nums
#分割数据集
train_ds=data.skip(test_nums)#跳过测试集的图片其他都为训练集
test_ds=data.take(test_nums)
batch_size=16
#参考上节博客我介绍的打乱数据的方法,我们这里对数据进行处理
train_ds=train_ds.repeat().shuffle(train_nums).batch(16)

4.模型的创建与配置

创建好输入值后,我们需要建立合适的深度学习模型,这里我们利用卷积神经网络多层卷积神经网络来学习就可以了,建立模型如下:

model = tf.keras.Sequential()   
model.add(tf.keras.layers.Conv2D(64, (3, 3), input_shape=(256, 256, 3), activation='relu'))
model.add(tf.keras.layers.Conv2D(64, (3, 3), activation='relu'))
model.add(tf.keras.layers.MaxPooling2D())
model.add(tf.keras.layers.Conv2D(128, (3, 3), activation='relu'))
model.add(tf.keras.layers.Conv2D(128, (3, 3), activation='relu'))
model.add(tf.keras.layers.MaxPooling2D())
model.add(tf.keras.layers.Conv2D(256, (3, 3), activation='relu'))
model.add(tf.keras.layers.Conv2D(256, (3, 3), activation='relu'))
model.add(tf.keras.layers.MaxPooling2D())
model.add(tf.keras.layers.Conv2D(512, (3, 3), activation='relu'))
model.add(tf.keras.layers.Conv2D(512, (3, 3), activation='relu'))
model.add(tf.keras.layers.MaxPooling2D())
model.add(tf.keras.layers.Conv2D(512, (3, 3), activation='relu'))
model.add(tf.keras.layers.Conv2D(512, (3, 3), activation='relu'))
model.add(tf.keras.layers.Conv2D(512, (3, 3), activation='relu'))
model.add(tf.keras.layers.GlobalAveragePooling2D())
model.add(tf.keras.layers.Dense(1024, activation='relu'))
model.add(tf.keras.layers.Dense(256, activation='relu'))
model.add(tf.keras.layers.Dense(1, activation='sigmoid'))

创建模型如上,我们使用多层卷积神经网络虽然会让计算难度增大,但卷积神经网络学习特征的能力也非常强大,有条件的人可以安装CUDA和CUDNN来达到调用GPU从而来加速训练模型,像我这种电脑不行的可以使用kaggle这个平台来训练。

接下来,我们对于模型进行编译(即选择模型的优化器,配置模型的各项超参数,同时我们还可以查看每次训练的accuracy,准确率)

model.compile(optimizer=tf.keras.optimizers.Adam(0.0001),
              loss=tf.keras.losses.BinaryCrossentropy(),
              metrics=['acc']
)
#这里我们设置学习率为0.0001,手动设置,我设置了很多次测试最后发现它会比较好
#损失函数由于是二分类,我们调用BinaryCrossentropy

然后我们开始训练即可:

model.fit(train_ds, epochs=10, 
                    steps_per_epoch=steps, 
                    validation_data=test_ds, 
                    validation_steps=steps_valid)
 #steps为我们想让模型知道训练多少个batch为一整个数据集
 #训练十次就好了,不要太多浪费资源

5.下载模型在本地导入并用于预测

​ 我们是在一个网络平台上完成的任务,我们如果想将结果导入到本地,kaggle也是支持的,我们运用tensorflow提供的模型保存方法来保存

model.save('CNN.h5')
#这样模型会被保存到output/working文件夹下
#我们直接下载到本地就好了

import glob
model=tf.keras.models.load_model('CNN.h5')
index_to_label={0: 'airplane', 1: 'lake'}
def pred_img(path):
    img=load_img(path)
    img=tf.expand_dims(img,axis=0)
    res=model.predict(img)
    print(index_to_label.get((res>0.5).astype('int')[0][0]))
    #预测出来的是个概率值大于0.5被认为是1,小于为0,我们利用这个来找到该图片对应的标签

利用kaggle提供的免费GPU完成卫星图片识别任务_第5张图片

这样我们就发现我们建立的模型可以成功完成预测任务,我们在这里使用了免费的GPU服务,制约大部分人的硬件或者环境问题,可以这样将解决(当然如果你要训练大型任务我不推荐这个,因为kaggle的连续训练时间是有限的)

结语

在本篇中,我们使用了kaggle提供的免费GPU完成了深度模型的训练任务,并将它下载至本地中,我们测试了它的正确性,

那么就到这了,如果本篇对你有用别忘了点个赞,有什么疑问或者有什么对博主的建议。可以评论区交流,谢谢、

你可能感兴趣的:(利用kaggle提供的免费GPU完成卫星图片识别任务)