一。线性回归
1、顺序模型:model = keras.Sequential() #顺序模型(就像火车一节一节地拼起来)
2、layers.Dense(1, input_dim=1) #会输出一维的函数(y=ax+b, a是权重weight,b是偏置bias,x是特征值y)
3、model.summary() #显示一个表,包含了这个model的概况(维数,参数数。。。)
4、编译模型:model.compile(optimizer=‘adam(#是一个内置的优化算法,推荐使用)’,
loss(#优化的目标是)=‘mse(#最小化均方差(损失函数))’)
5、训练模型:model.fit(x, y, epochs=3000(#把所有数据训练3000遍))
6、预测模型:model.predict(x) #把所有的x放进去算出y值
plt.scatter(x, y, c=‘r’(#绘制红red点,图像更清晰,对比更清晰)) #绘制离散图像
plt.plot(x, model.predict(x)) #绘制连续图像
#(model.predict([150]))–>仅传进去一个x=150,求y值
二、多元线性回归
import pandas as pd #pandas是一个强大的数据预处理包
data = pd.read_csv('./dataste/Ad...文件名balabala.csv)
#csv是一种文件格式,应用于程序之间转移表格数据
data.head() #取前五行数据
x = data[data.columns[1:-1]] #取1到-1列
x #查看x的值
y = data.iloc[:,-1] #取最后一列
#建立模型
model = keras.Sequential()#初始化(建立)一个model
model.add(layers.Dense(1, input_dim=3))#建立层,输入的特征维度是3,输出的目标维度是1。 y_pred = weight1*t1 + w2*t2 + w3*t3 + bias
#编译模型
model.compile(optimizer='adam',
loss = 'mse')
model.fit(x, y, epochs=2000)
#预测模型
model.predict(pd.DataFrame([[300, 0, 0]]))
#output的就是预测的y值
二、逻辑回归
线性回归预测的是一个连续值,
而逻辑回归给的是一个是或否的回答(分类问题)(使用sigmoid函数:将线性结果映射为分类结果)
在逻辑回归中,显然已经不能再用均方差损失了。
所以引入交叉熵损失函数:假设概率分布p为期望输出值,实际为q,H(p, q)就是交叉熵(在keras里,使用
binary_crossentropy来计算二元交叉熵)
那么对于多元分类就使用softmax函数
softmax函数:
1、其要求每个样本必须属于某个类别,且所有可能样本均被覆盖。
2、样本分量之和为1(也就是某个样本是第一类,第二类…的占比分别为0.4、0.2…加和为1,然后归类为占比最大的那一类,从而实现多元分类)
3、keras中使用
categorical_crossentropy或sparse_categorical_crossentropy
三、手写数字识别
import keras
from keras import layers
import matplotlib.pyplot as plt #python的2D绘图库
%matplotlib inline
#魔法命令,可将matplotlib图表直接嵌入到Notebook中,或使指定的界面库显示图表,
#并且可以省略掉plt.show()这一步
import keras.datasets.mnist as mnist
(train_image, train_label), (test_image, test_label) = mnist.load_data() #image是图片,label是标签。两个括号中分别是测试集和数据集。
train_image.shape #看这个数据集有多大
#out:(6000,28,28) #6000是图片的数量,28*28是像素
plt.imshow(train_image[0])
#out:会展示第0号图片的图像
这里使用的Dense是全连接层,而非卷积神经网络。接下来我们继续用全连接层来识别数字图片。
model = keras.Sequential()
model.add(layers.Flatten()) #这个Flatten取代了Dense,其可以将(6000,28,28)这样的三维数据展平成二维的(6000,28*28)。
model.add(layers.Dense(64, activation='relu'))
#设置64个单元,每个单元用relu来激活。(28*28-->64)
model.add(layers.Dense(10, activation='softmax'))
#(64-->10),一共有十个label(分类)
model.compile(optimizer='adam',
loss='sparse_categoricla_crossentropy',
metrics=['acc'])
#acc是准确率
modle.fit(train_image, train_label, epochs=50, batch=512)
#batch=512就是分批次训练,512张图片一个批次。图片训练起来很占内存,怕电脑内存爆炸,所以分批次训练
model.evaluate(test_image, test_label)
#out:[2.xxxx(不知道是什么), 0.8713(准确率,欠拟合)]
model.evaluate(train_image, train_label)
#out:[1.8xxx(不造是什么), 0.8825]
import numpy as np
np.argmax(model.predict(test_image[:10]), aixs=1)
#aixs=1操作时只有第1维的下表变化,其他不变
#out:array([7,8,xxxxx共十个数], dtype=int64(不造是啥))
test_label[:10]
#out:array([7,8,xxxxx共十个数],dtype=unit8)
#其中有一个label与预测的不一样
#-->增大网络容量,直到拟合
#-->优化模型
#-->增加隐藏层model.add(layers.Dense(64,activation='relu'))
若函数欠拟合
–>增大网络容量,直到拟合
–>优化模型
–>增加隐藏层model.add(layers.Dense(64,activation=‘relu’))
model = keras.Sequential()
model.add(layers.Flatten())
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(64, activation='relu'))#多加几个隐藏层
model.add(layers.Dense(10, activation='softmax'))
model.compile(optimizer='adam',
loss='sparse_categoricla_crossentropy',
metrics=['acc'])
modle.fit(train_image, train_label, epochs=50, batch=512,validation_data=(test_image, test_label))
#validation_data边训练边测试,缺点就是速度会变慢