栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

机器学习——从0开始构建自己的深度学习网络

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

机器学习——从0开始构建自己的深度学习网络

目录

前言

第一步 软件安装——anaconda,pycharm

第二步 工具安装

 第三步 Jupyterlab的使用

 第四步 正式开始

1. 文件展示

2. 代码(一)——图片读取

 3. 代码(二)——图片输出

  4. 代码(三)——数据预处理以及网络搭建

  5. 代码(四)——验证分类结果

 总结


前言

本文仅作为经验分享以及学习记录,如有问题,可以在评论区和我讨论。

理论知识暂且不讲,待有时间了我就会慢慢分享理论知识,目前就整点干货,直接上代码,怎么从零开始构建自己的神经网络。

本项目Github地址

第一步 软件安装——anaconda,pycharm

正所谓工欲善其事必先利其器,既然要构建深度学习网络,那么我们就要安装我们的“工具”,这里我选择的是anaconda,和pycharm。具体的安装方法,请参考:

1.  anaconda安装方法

2.  pycharm安装方法

第二步 工具安装

多数神经网络代码,是.ipynb格式文件,所以我选择的运行工具是,anaconda里面的,JupyterlabJupyter Notebook,这两个一样,没差什么功能,就是Jupyterlab美观一些。

安装方法:

 切换自己的环境,然后点击JupyterlabJupyter Notebook的install。等待之后就好了。

关于如何更改JupyterlabJupyter Notebook的起始文档位置,切换JupyterlabJupyter Notebook启动浏览器,添加快捷方式等。都可以在网上查到,有时间我也会整理一下,发布出来。

 启动之后浏览器会跳转到这个页面,这个就是Jupyterlab:

 第三步 Jupyterlab的使用

这一部分简单介绍一下,Jupyterlab的使用方法。

1.新建文件:点击加号,选择notebook即可。

 2.简单功能:

上面红框依次是:保存、增加cell、剪切、复制、粘贴、运行、暂停、重置。

右侧红框依次是:复制当前cell并粘贴到本cell下方、cell上移、cell下移、上方加cell、下方加cell、删除cell。

  3.快捷键:

  •  Ctrl+Enter:运行此cell,不跳转到下一个cell
  •  Shi+Enter:运行此cell,跳转到下一个cell

选中cell前面的 [ ]:

  • X 删除选中的cell
  • M ,然后运行cell,将当前cell变成文本(个人理解,有误望指出)

 第四步 正式开始

这里我们直接开始,直接上代码,通过代码,一方面有助于我梳理本次学习思路,二是我觉得这样更直接明了一些,毕竟动手才有趣。

1. 文件展示

 

 

 每个cats、dogs文件夹下都是 猫or狗 图片

2. 代码(一)——图片读取
import os
# import zipfile
dog_dir = os.path.join('F:/tmp/cat_dog/training/dogs')
cat_dir = os.path.join('F:/tmp/cat_dog/training/cats')

print('total training dog images:', len(os.listdir(dog_dir)))
print('total training cat images:', len(os.listdir(cat_dir)))    # 计算路径下有多少文件

dog_files = os.listdir(dog_dir)            # 获取路径下所有文件
print(dog_files[:10])                        # 列出前十个文件名

cat_files = os.listdir(cat_dir)
print(cat_files[:10])

cell运行结果: 

total training dog images: 8000
total training cat images: 8000
['0.jpg', '1.jpg', '10.jpg', '100.jpg', '1000.jpg', '1001.jpg', '1002.jpg', '1004.jpg', '1005.jpg', '1006.jpg']
['0.jpg', '1.jpg', '10.jpg', '100.jpg', '1000.jpg', '1001.jpg', '1002.jpg', '1003.jpg', '1004.jpg', '1005.jpg']

 可以看到当前目录下共8000个文件,与结果符合。

 3. 代码(二)——图片输出
%matplotlib inline

import matplotlib.pyplot as plt
import matplotlib.image as mpimg

pic_index = 2            # 输出几张图片

next_dog = [os.path.join(dog_dir, fname) 
                for fname in dog_files[pic_index-2:pic_index]]
next_cat = [os.path.join(cat_dir, fname) 
                for fname in cat_files[pic_index-2:pic_index]]

for i, img_path in enumerate(next_dog+next_cat):            #输出图片
  #print(img_path)
  img = mpimg.imread(img_path)
  plt.imshow(img)
  plt.axis('Off')
  plt.show()

cell运行结果: 猫狗分别两张

  4. 代码(三)——数据预处理以及网络搭建
import tensorflow as tf
import keras_preprocessing
from keras_preprocessing import image
from keras_preprocessing.image import ImageDataGenerator

TRAINING_DIR = "./rps/"
training_datagen = ImageDataGenerator(
      rescale = 1./255,
	  rotation_range=40,
      width_shift_range=0.2,
      height_shift_range=0.2,
      shear_range=0.2,
      zoom_range=0.2,
      horizontal_flip=True,
      fill_mode='nearest')

VALIDATION_DIR = "./rps-test-set/"
validation_datagen = ImageDataGenerator(rescale = 1./255)

train_generator = training_datagen.flow_from_directory(
	TRAINING_DIR,
	target_size=(150,150),
	class_mode='categorical'
)

validation_generator = validation_datagen.flow_from_directory(
	VALIDATION_DIR,
	target_size=(150,150),
	class_mode='categorical'
)

model = tf.keras.models.Sequential([
    # Note the input shape is the desired size of the image 150x150 with 3 bytes color
    # This is the first convolution
    tf.keras.layers.Conv2D(64, (3,3), activation='relu', input_shape=(150, 150, 3)),
    tf.keras.layers.MaxPooling2D(2, 2),
    # The second convolution
    tf.keras.layers.Conv2D(64, (3,3), activation='relu'),
    tf.keras.layers.MaxPooling2D(2,2),
    # The third convolution
    tf.keras.layers.Conv2D(128, (3,3), activation='relu'),
    tf.keras.layers.MaxPooling2D(2,2),
    # The fourth convolution
    tf.keras.layers.Conv2D(128, (3,3), activation='relu'),
    tf.keras.layers.MaxPooling2D(2,2),
    # Flatten the results to feed into a DNN
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dropout(0.5),
    # 512 neuron hidden layer
    tf.keras.layers.Dense(512, activation='relu'),
    tf.keras.layers.Dense(3, activation='softmax')
])


model.summary()                  # 神经网络结构可视化

model.compile(loss = 'categorical_crossentropy', optimizer='rmsprop', metrics=['accuracy'])
            # loss 损失函数:交叉熵         # optimizer 学习步长            # metrics 性能:准确度
history = model.fit_generator(train_generator, epochs=5, validation_data = validation_generator, verbose = 1)
                                # 学习步长             #                # verbose 记录日志
# model.save("catdog.h5")
   # 模型保存为 catdog.h5

 cell运行结果: 可以看到训练样本准确度和测试样本准确的分别为70%和76%(可以就该epoch,来增加训练伦数,以提高准确度)

网络结构:

 训练过程:

Epoch 1/5
499/500 [============================>.] - ETA: 0s - loss: 0.7014 - acc: 0.5471
D:PPPanghaoanaconda3envspy37libsite-packagesPILTiffImagePlugin.py:793: UserWarning: Truncated File Read
  warnings.warn(str(msg))
500/500 [==============================] - 300s 600ms/step - loss: 0.7014 - acc: 0.5473 - val_loss: 0.6831 - val_acc: 0.5045
Epoch 2/5
500/500 [==============================] - 221s 441ms/step - loss: 0.6510 - acc: 0.6269 - val_loss: 0.6043 - val_acc: 0.6790
Epoch 3/5
500/500 [==============================] - 222s 444ms/step - loss: 0.6168 - acc: 0.6694 - val_loss: 0.5558 - val_acc: 0.7080
Epoch 4/5
500/500 [==============================] - 223s 446ms/step - loss: 0.5964 - acc: 0.6859 - val_loss: 0.5875 - val_acc: 0.6630
Epoch 5/5
500/500 [==============================] - 222s 443ms/step - loss: 0.5751 - acc: 0.7024 - val_loss: 0.4868 - val_acc: 0.7660

  5. 代码(四)——验证分类结果

先将图片预处理:

from PIL import Image

#  待处理图片路径
image = Image.open("./cd/cat.jpg")
#  resize图片大小,入口参数为一个tuple,新的图片的大小
img_size = image.resize((150,150))
image = img_size
#  处理图片后存储路径,以及存储格式
img_size.save('./cd/catt.jpg', 'jpeg')

测试图片:

import numpy as np
from tensorflow.keras.preprocessing import image
# import matplotlib.pyplot as plt  # plt 用于显示图片
import matplotlib.image as mpimg  # mpimg 用于读取图片

image = mpimg.imread("./cd/catt.jpg")
# print(image.shape)
image = image.reshape(1,150,150,3)/255
# image=image/255
c = model.predict(image,batch_size=1)
print(c)

cell运行结果:可以看到是猫的概率为70%,狗的概率为30%,所以结果为猫

  [[0.69656205 0.30343798]]

 总结

至此本博客,从0开始搭建神经网络就结束了,有什么问题欢迎和我讨论。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/920225.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号