NLP学习D3-TF2chap3-4总结和代码实现(八股框架+CNN网络合集)+多线程

今天早上3点就醒了,在床上读了一会原著,忍不住又看了一遍chap6的视频,后来到自习室继续看,对RNN\LSTM\GRU有了更深入的理解。吃完饭以后想着把BP再看下,毕竟这很基础。今天有时间再去回看下梯度下降。这些概念以前都看过,也挣扎过,所以知道大家学习时的痛苦。总觉得网上很少有教程能给出overview && vivid的解释,so i am trying to figure it out!
说来有趣,现在再来看这些概念,感觉比以前多理解了不少,有意思!!!
最近也进入了疯狂吸收cs知识的时候,求知欲爆棚!!!都没什么时间学英语了,不过要抓紧机会早成正反馈局面!!!

好了,现在08:16-------开始敲chap3的八股代码了!!!

------------------------------续D2

chap3实践

(一)问题
1、compile中的meric是仅仅打印出来,还是会根据这个选w参数???
就仅仅打印出来,供人参考,不参与优化;优化还是根据loss
参考文献:
https://blog.csdn.net/chenhepg/article/details/115721826
这篇里面还写了常用的参数;当然官网也有
在这里插入图片描述
2.model.fit的validation_freq参数
这个是说,过多少个epoch,用testdata验证一下。
在这里插入图片描述

3.super().init()用法
“我理解是,当需要继承父类构造函数中的内容,且子类需要在父类的基础上补充时,使用super().init()方法。

我的理解就是,先继承别人的,然后再进行补充,就要用这个super()
参考链接:
https://www.cnblogs.com/hancece/p/11177852.html

4.Model类中call函数的参数
原来第二个参数是input呀,怪不得。

在这里插入图片描述
在这里插入图片描述

(二)自己完成fashion数据集的任务
1、先看看数据集的样子
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
好开心呀,第一次自己独立写模型,虽然很简单,但是还是很开心!!!
代码如下:

import tensorflow as tf
from tensorflow.keras import Model
from tensorflow.keras.layers import Flatten,Dense
import matplotlib.pyplot as plt
fashion = tf.keras.datasets.fashion_mnist
(x_train, y_train), (x_test, y_test) = fashion.load_data()
x_train,x_test = x_train/255.0,x_test/255.0

class FashionModel(Model):
def init(self):
super(FashionModel, self).init()
self.f1 = Flatten()
self.d1 = Dense(128, activation=‘relu’)
self.d2 = Dense(10, activation=‘softmax’)
def call(self, x):
x = self.f1(x)
x = self.d1(x)
y = self.d2(x)
return y
model = FashionModel()

model.compile(optimizer=‘adam’,
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False),
metrics=[‘sparse_categorical_accuracy’])

model.fit(x_train,y_train,batch_size=32,epochs=5,validation_data=(x_test,y_test),validation_freq=1)
model.summary()

训练效果:
在这里插入图片描述
后期会学画acc图的!!!!!

chap4很重要的其他附加功能

在这里插入图片描述
1、自制数据集,解决本领域应用(解决如何将本领域数据规则化导入)
(1)img.convert(‘L’)
PIL有九种不同模式: 1,L,P,RGB,RGBA,CMYK,YCbCr,I,F。
相当于转换为灰度图像,每个像素点用8个bit表示,表示0-255的灰度。
如果参数是1,也是用8位表示,不过是非黑即白,见参考链接。
img.convert(‘1’)
参考链接:https://www.cnblogs.com/haifwu/p/12825741.html
在这里插入图片描述
(2)reshape中-1的含义
在这里插入图片描述
https://blog.csdn.net/weixin_39449570/article/details/78619196

这么操作估计是因为np.save只能存1维和2维。所以需要转换吧。这样上面reshape的问题也解决了
在这里插入图片描述https://blog.csdn.net/u010089444/article/details/52738479
在这里插入图片描述
(3)这里整体思路很有意思,值得学习
A、如果之前没保存数据,就生成数据并保存;如果保存了,就直接加载进来【毕竟生成一次还挺麻烦的】
B、生成train和test的思路相同,所以写个函数来实现:
读取txt的每一行,【0】为图片名称,求图片路径,加载图片,并进行处理;【1】为标签;分别一一对应保存进入x和y_。最后把列表变为np类型返回 x = np.array(x)# turn into numpy
不过不知道为什么要把y_变成64位整型??/
C、PIL的Image可以用来加载、处理图片
在这里插入图片描述

具体代码:

import numpy as np
import tensorflow as tf
from PIL import Image
import os
# mnist = tf.keras.datasets.mnist
# (x_train, y_train), (x_test, y_test) = mnist.load_data()
# x_train, x_test = x_train / 255.0, x_test / 255.0
# 自己写入数据集
train_path = './mnist_image_label/mnist_train_jpg_60000/'
train_txt = './mnist_image_label/mnist_train_jpg_60000.txt'
x_train_savepath = './mnist_image_label/mnist_x_train.npy'
y_train_savepath = './mnist_image_label/mnist_y_train.npy'

test_path = './mnist_image_label/mnist_test_jpg_10000/'
test_txt = './mnist_image_label/mnist_test_jpg_10000.txt'
x_test_savepath = './mnist_image_label/mnist_x_test.npy'
y_test_savepath = './mnist_image_label/mnist_y_test.npy'
# 图片路径,标签文件
def generateds(path, txt):
    f = open(txt, 'r')
    contents = f.readlines()
    f.close()
    x,y_ =[],[]
    for content in contents:
        value = content.split()
        img_path = path+value[0]
        img = Image.open(img_path)
        # 图片变为8位宽灰度值的np.array格式
        img = np.array(img.convert('L'))
        img/=255.
        x.append(img)
        y_.append(value[1])
        print('loading:'+content)
    x = np.array(x)# turn into numpy
    y_ = np.array(y_)
    y_ = y_.astype(np.int64)#变为64位整型
    return x,y_

if os.path.exists(x_train_savepath) and os.path.exists(y_train_savepath)\
    and os.path.exists(x_test_savepath) and os.path.exists(y_test_savepath):
    print('----------------Load Datasets--------------')
    x_train_save = np.load(x_train_savepath)
    y_train = np.load(y_train_savepath)
    x_test_save = np.load(x_test_savepath)
    y_test = np.load(y_test_savepath)
    # 在np.save的时候只能存1维或2维,所以需要转换.本身是28*28的数据,恢复回来~
    x_train = np.reshape(x_train_save, (len(x_train_save),28,28))
    x_test = np.reshape(x_test_save, (len(x_test_save),28,28))
else:
    print('-------------Generate Datasets-----------------')
    x_train, y_train = generateds(train_path, train_txt)
    x_test, y_test = generateds(test_path, test_txt)
    print('-------------Save Datasets-----------------')
    x_train_save = np.reshape(x_train,(len(x_train),-1))
    x_test_save = np.reshape(x_test,(len(x_test),-1))
    np.save(x_train_savepath, x_train_save)
    np.save(y_train_savepath, y_train)
    np.save(x_test_savepath, x_test_save)
    np.save(y_test_savepath, y_test)


2、数据增强,扩充数据集(这里以image为例,有接口,注意它在六步八股文中的位置——在第二步,数据处理的部分)

(1)在做数据增强后,model.fit中的内容也要改变。
在这里插入图片描述
(2)数据增强本身
在这里插入图片描述
不知道为啥要给数据增加一个维度???
在这里插入图片描述

3、断点续训,存取模型(这个很重要啊!!!注意位置,在fit训练部分)
(1)取模型就用model.load_weights(path)
在这里插入图片描述
(2)存模型有两步
A定义回调函数
在这里插入图片描述

B在model.fit中设置,并取得返回值history
在这里插入图片描述

4、参数提取,存入文本(上面已经可以存模型,存参数了,但是参数具体时多少呢?也挺重要的)
(1)用model.trainable_variables返回参数
(2)设置np.set_printoptions(threshold=np.inf)保证能够被全部打印出来,不被省略

5、acc/losss可视化,查看训练效果(不会有人不会可视化叭????)
咱就是说,没瞎想到刚才因为保存模型参数用到的回调函数的返回值history,居然这么nb。可以调出来这么多东西——相当于整个在训练过程中的这写我写的metrics里的评价指标和loss都有了。好家伙,直接plt就可以了。
在这里插入图片描述
好家了个活,连plt画子图都出来了。
好家伙在,我这个结果也是吓死我了
在这里插入图片描述

6、应用程序,给图识别(讲的其实是如何在别人的work上迁移模型直接进行预测,真好真贴心)
(1)复现模型(好进行前向传播)
(2)加载参数
(3)预测
在这里插入图片描述

嗯,我就自创一个把,根据之前保存的模型,对当前路径的几张图片进行预测

(1)img.resize参数
在这里插入图片描述

这个resize是改变图片大小,后面的参数是选择图片质量
参考:https://blog.csdn.net/xjp_xujiping/article/details/81607964
在这里插入图片描述

需要注意的是
(1)定义模型路径
(2)复现模型
(3)加载模型
(4)加载待预测数据并进行预处理,使其更符合训练时的情景。
(5)预测

带预测数据咋这样???tf.newaxis,…
这个就是相当于待预测数据不是没有batch那一维度嘛,生生加一个维度。

结果如上,可见tf.newaxis的主要用途是增加一个维度,位置不同,增加的维度是第几维也相对不一样,可以解决用训练好的神经网络模型进行预测时的维度不匹配问题。

参考链接:https://blog.csdn.net/qq_40183315/article/details/107808112

突然想到一件事,之前在想为什么这种框架里没有设置3种data集?现在看到这个validation和train突然想到!!!!!!!!!整个就叫做一个train,其实分为小弟的train和validation,这是我不断看数据去跳整的部分。为了分离test,甚至都不让test进入,真隔离了。

** plt.pause(1)这又是啥玩意**
就是暂停一会,再继续画。像参考文献这样,加入for循环,保持图像位置不变,调整别的东西以后,就有点像动画???
参考文献:https://vimsky.com/examples/usage/matplotlib-pyplot-pause-in-python.html
** plt.set_cmap(‘gray’)有啥用
**
就是显示灰度图的意思

为啥我把这个处理注释掉,结果这么差呢??
这个是只有黑色和白色的高对比度图片,拒绝背景噪声,阈值可选择
在这里插入图片描述
在这里插入图片描述
哦哦哦,又去听了下课。原来训练的时候时黑底白字,现在时白底黑字。要转换一下
在这里插入图片描述
黑白反转,效果也一般
在这里插入图片描述
然后老师这里用的时高对比度,就上面那个图。

---------0844敲完了p8sequential定义结构

-----0900敲完了p11calss定义结构,去接杯水,休息一下

------0906回来继续写啦

----0913完成p13导入并可视化mnist数据集

—0920完成了P14定义了更复杂的模型;并且验证数据集是单独导入的;对灰度数据进行了处理

-----0929完成了p15,虽然只是换成了用class定义模型结构,但是为了巩固代码,我还是都默写了一遍。

----------------0950完成fashion作业,因为class比sequential更加灵活,所以在task中就只练习了这一个定义模型的方法,去接杯水,休息一下~回来看chap4了!!!!!!!我先git一下
git add --all – ‘:!d.txt’
哎,class4中的txt太大了,传不上去,只好学习如何git add忽略文件

---------1002去接个水,回来继续
在这里插入图片描述
-------11:00完成chap4自制数据集的功能~
去干饭!!!!!!!!!
commit了一下,这次只commit了我自己写的文件,那个大数据集没交。。。

--------13:25中午去洗了澡,帮同学correct英文摘要,弄自己的电子签名,现在继续写啦~

-----------1514终于完成了chap4,要去休息一下了!!!!!!!

—去做了核酸检测、看了一会CATTI的书武峰12天D1,然后趴了一会,听了一个大数据分享,我感觉很有意思,正好想学Transformer,可以做做!
今天还看了莫凡的多线程教程,争取把多进程也看完!!!
现在2051,打算把武峰老师视频课D1学完,然后报名比赛,再学点别的之类的去睡啦!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值