TensorFlow 入门实操课程-Day1

学习网址:https://www.icourse163.org/learn/youdao-1460578162?tid=1461280442#/learn/content

1、入门第一课
·神经元网络适合处理float
构建模型-优化和损失函数-准备训练数据-训练模型-评估数据
loss越来越小,说明实验靠谱
keras强大简单的API,将神经元网络模型定义为一组Sequential层

from tensorflow import keras
import numpy as np
#构建模型
model=keras.Sequential([keras.layers.Dense(units=1,input_shape=[1])])
#优化和损失函数
model.compile(optimizer='sgd',loss='mean_squared_error')
#准备训练数据
xs=np.array([-1.0,0.0,1.0,2.0,3.0,4.0],dtype=float)
ys=np.array([-3.0,-1.0,1.0,3.0,5.0,7.0],dtype=float)
#训练模型
model.fit(xs,ys,epochs=500)
#验证数据,接近19
model.predict([10.0])

2、计算机视觉(图片)
根据图片灰度来识别
·加载Fashion MNIST数据集

import tensorflow as tf
from tensorflow import keras
fashion_mnist = keras.datasets.fashion_mnist
#(用来训练的数据集,标签),(测试用的图片,标签)
(train_images,train_labels),(test_images,test_labels)=fashion_mnist.load_data()
·查看数据集
#训练集:6w张像素为28x28的图片(60000, 28, 28)
print(train_images.shape)
#测试集:(10000, 28, 28)
print(test_images.shape)
#查看图片具体灰度值
print(train_images[0])
#查看第一张图片
import matplotlib.pyplot as plt
plt.imshow(train_images[0])

·构造模型
三层结构:全连接网络结构
第一层:输入层,训练集都是28x28=shape也是28x28

第二层:中间层,128个神经元,任意定,可以修改
理论:28x28x128=100352
实际:每一层自动加1个bias,截距
(28*28+1)*128=100480

第三层:输出层,要分的类别有10个=10个神经元
理论:128*10=1280
实际:每一层自动加1个bias,截距
(128+1)*10=1290

Sequential:定义了神经网络中的层数序列。一开始学习神经元网络总是使用序列模型。

Flatten:把二维数组变成一维数组。

Dense:增加一层神经元。

每一层神经元都需要一个激活函数 activation来告诉它们输出什么。有很多选项,但目前只用这些(relu和softmax)。

Relu: "如果X>0返回X,否则返回0"--所以它的作用是它只把大于0的值传递给网络中的下一层,小于0的也当作0。

Softmax:激活函数接收到一组值后,选择其中最大的一个输出。

例如,上一层的输出为[0.1, 0.1, 0.05, 0.1, 9.5, 0.1, 0.05, 0.05, 0.05],Softmax就省去了你在其中寻找最大的值,并把它变成[0,0,0,0,0,1,0,0,0,0,0]

"如果X>0,则返回X,否则返回0" -- 所以它的作用是只把0或更大的值传给下一层的网络。--其目的是节省大量的编码

model = keras.Sequential([
keras.layers.Flatten(input_shape=(28,28)),
keras.layers.Dense(128,activation=tf.nn.relu),
keras.layers.Dense(10,activation=tf.nn.softmax)
])
#另一种写法
model = keras.Sequential()
model.add(keras.layers.Flatten(input_shape=(28,28)))
model.add(keras.layers.Dense(128,activation=tf.nn.relu))
model.add(keras.layers.Dense(10,activation=tf.nn.softmax))
#查看构建的模型
model.summary()

·训练模型

train_images=train_images/255#让训练集变成0-1之间的数,正确率更高
model.compile(optimizer=tf.optimizers.Adam(),loss=tf.losses.sparse_categorical_crossentropy,metrics=['accuracy'])
model.fit(train_images,train_labels,epochs=5)
#Adam()经常使用的优化
#有类别:用categorical
#[0,0,0,0,0,0,0,1]=one_hot,只有一个类别,要用categorical_crossentropy

·评估模型

test_images_scaled=test_images/255#前面用了,后面也得用
model.evaluate(test_images_scaled,test_labels)

·用模型来判断单张图片的类别-->predict

import numpy as np
import matplotlib.pyplot as plt
print(np.argmax(model.predict((test_images[0]/255).reshape(1,28,28,1))))#模型运行
print(test_labels[0])#正确
plt.imshow(test_images[0])

·自动终止训练
过拟合:训练次数太多,导致对旧数据准确率高,新数据则低
怎么看是否过拟合:测试loss与训练loss,走势不一致


import tensorflow as tf
from tensorflow import keras
#回调函数停止运行
class myCallback(tf.keras.callbacks.Callback):   def on_epoch_end(self,epoch,logs={}):     if (logs.get('loss')<0.4):       print(' Loss is low so cancelling training!')       self.model.stop_training=
True
callbacks
=myCallback() #加载数据集 fashion_mnist = keras.datasets.fashion_mnist (train_images,train_labels),(test_images,test_labels)=fashion_mnist.load_data()

#也可以写成train_images, test_images = train_images / 255.0, test_images / 255.0 train_images
=train_images/255 test_images=test_images/255 #构造模型

model = keras.Sequential([
     keras.layers.Flatten(input_shape=(28,28)),
     keras.layers.Dense(128,activation=tf.nn.relu),
     keras.layers.Dense(10,activation=tf.nn.softmax)
])

#训练模型
model.compile(optimizer=tf.optimizers.Adam(),
        loss=tf.losses.sparse_categorical_crossentropy,
        metrics=['accuracy'])
#也可以写成
#model.compile(optimizer='adam',
#        loss='sparse_categorical_crossentropy',
#        metrics=['accuracy'])
model.fit(train_images,train_labels,epochs=5,callbacks=[callbacks])
原文地址:https://www.cnblogs.com/DLYQY/p/14421910.html