今天早上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
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)
img = np.array(img.convert('L'))
img/=255.
x.append(img)
y_.append(value[1])
print('loading:'+content)
x = np.array(x)
y_ = np.array(y_)
y_ = y_.astype(np.int64)
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)
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学完,然后报名比赛,再学点别的之类的去睡啦!
|