tf.keras交叉熵
二分类
binar_crossentropy
多分类
- categorical_crossentropy#label进行独热编码时使用
- spares_categorical_crossentropy#输出label数值编码时,比如0,1,2…
来计算softmax
pandas
import pandas as pd
data = pd.read_csv('filename',head=None)#如果没有表头head=None
data.head()#打印出表头
data.iloc[:,-1].value_counts()#count最后一列数值频数
x = data.iloc[:,1:-1]#取第一列到倒数第二列
y = data.iloc[:,-1]
逻辑回归
import tensorflow as tf
import pandas as pd
data = pd.read_csv('filename',head=None)#如果没有表头head=None
data.head()#打印出表头
data.iloc[:,-1].value_counts()#count最后一列数值频数
x = data.iloc[:,1:-1]#取第一列到倒数第二列
y = data.iloc[:,-1]
model = tf.keras.Sequential()
model.add(tf.keras.layers.Dense(4, input_shape=(15,),activation='relu')) #15为输入维度(特征)
model.add(tf.keras.layers.Dense(4,activation='relu'))#第二层不需要去定义输入,会自动推断
model.add(tf.keras.layers.Dense(1, activation='sigmoid')
model.summary()#会输出模型
model.compile(optimizer='adam',loss='binary_crossentropy',metrics=['acc'])#acc记录准确性,也可记录loss
history= model.fit(x,y,epochs=1000)#训练
history.history.keys()#history.history是个字典会,这里会输出dict_keys(['loss','acc'])
plt.plot(history.epoch, history.history.get('loss'))#画出loss变化图
test = data.iloc[:,1:-1]
model.predict(test) #预测
softmax多分类
import tensorflow as tf
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
#加载fashin_mnist数据集
(train_image,train_label),(test_image,test_label)= tf.keras.datasets.fashion_mnist.load_data()
train_image.shape#(60000,28,28)60000张28X28图片,都是array格式
train_label.shape#(60000,)60000个标签
plt.imshow(train_image[0])#打印出第一张,取值是0-255
#归一化
train_image = train_image/255
test_image = test_image/255#取值都是从0-1
model = tf.keras.Sequential()
#输入不是一维,所以添加这一层扁平层
model.add(tf.keras.layers.Flatten(input_shape=(28,28)))#变成向量
model.add(tf.keras.layers.Dense(128,activation='relu'))
model.add(tf.keras.layers.Dense(10,activation='softmax'))#十个输出为概率分布和为1
model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['acc'])
model.fit(train_image, train_label,epochs=1000)
model.evaluate(test_image,test_label)#评价
独热编码
train_label#前一节fashionmnist,array([9, 0, 0, ..., 3, 0, 5], dtype=uint8)
# 如果是分类城市
beijing [1,0,0]#位置为1其他为0
shanghai [0,1,0]
shenzhen [0,0,1]
#这种情况下loss就使用
loss = 'categorical_crossentropy'
#下面对前面的fashion_mnist进行独热编码
train_label_onehot = tf.keras.utils.to_categorical(train_label)
train_label_onehot[0]#array([0., 0., 0., 0., 0., 0., 0., 0., 0., 1.], dtype=float32),长度为10,第9个为1
train_label[0]#9
# 模型
test_label_onehot = tf.keras.utils.to_categorical(test_label)
model.add(tf.keras.layers.Flatten(input_shape=(28,28)))#变成向量
model.add(tf.keras.layers.Dense(128,activation='relu'))
model.add(tf.keras.layers.Dense(10,activation='softmax'))#十个输出为概率分布和为1
model.compile(optimizer='adam',
loss='categorical_crossentropy',
metrics=['acc'])#这里的loss变了
# 训练,输入数据为独热编码数据
model.fit(trainimage, train_label_onehot,epochs=10)
# 预测
predict = model.predict(test_image)
predict[0]#softmax结果,array([1.9723153e-05, 2.7903539e-08, 1.4551173e-06, 9.5434382e-07,
8.0094524e-06, 9.6416617e-05, 2.3268458e-06, 1.5682883e-03,
8.5663942e-06, 9.9829429e-01], dtype=float32)
np.max(predict[0])#0.9982943
np.argmax(predict[0])# 9 最大预测值序号
test_label[0]#9
Dropout抑制过拟合
#每次训练会在validation上验证loss以及acc情况
model.fit(train_image, train_label,epochs=10,,validation_data = (test_image,test_label))
import tensorflow as tf
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
#加载fashin_mnist数据集
(train_image,train_label),(test_image,test_label)= tf.keras.datasets.fashion_mnist.load_data()
train_image.shape#(60000,28,28)60000张28X28图片,都是array格式
train_label.shape#(60000,)60000个标签
plt.imshow(train_image[0])#打印出第一张,取值是0-255
#归一化
train_image = train_image/255
test_image = test_image/255#取值都是从0-1
model = tf.keras.Sequential()
#输入不是一维,所以添加这一层扁平层
model.add(tf.keras.layers.Flatten(input_shape=(28,28)))#变成向量
model.add(tf.keras.layers.Dense(128,activation='relu'))
model.add(tf.keras.layers.Dense(10,activation='softmax'))#十个输出为概率分布和为1
model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['acc'])
history = model.fit(train_image, train_label,epochs=10,validation_data = (test_image,test_label))
# 字典内存储
history.history.keys()#dict_keys(['loss', 'acc', 'val_loss', 'val_acc'])
# 画图
plt.plot(history.epoch,history.history.get('loss'),label='loss')
plt.plot(history.epoch,history.history.get('val_loss'), label='val_loss')
plt.legend()
可以看到train loss一直在下降,但到后面val_loss不减反增,这就是过拟合,下图也验证了过拟合,验证集上acc更低
过拟合:训练数据集得分高,测试数据上得分不高
#师兄dropout
model = tf.keras.Sequential()
model.add(tf.keras.layers.Flatten(input_shape = (28,28)))
model.add(tf.keras.layers.Dense(128,activation='relu'))
model.add(tf.keras.layers.Dropout(0.5))#丢弃概率
model.add(tf.keras.layers.Dense(128,activation='relu'))
model.add(tf.keras.layers.Dense(128,activation='relu'))
model.add(tf.keras.layers.Dense(10,activation='softmax'))
正则化可以在activation()中设定参数实现
函数式API
import tensorflow as tf
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
#加载fashin_mnist数据集
(train_image,train_label),(test_image,test_label)= tf.keras.datasets.fashion_mnist.load_data()
train_image = train_image/255.0
test_image = test_image/255.0
#模型
input = tf.keras.Input(shape = (28,28))
x =tf.keras.layers.Flatten()(input)
x =tf.keras.layers.Dense(32,activation='relu')(x)
x =tf.keras.layers.Dropout(0.5)(x)
out =tf.keras.layers.Dense(10,activation='softmax')(x)
model = tf.keras.Model(inputs= input,outputs=out)
# 判断两个数据集是否一样的概率
input1 = tf.keras.Input(shape = (28,28))
input2 = tf.keras.Input(shape = (28,28))
x1 =tf.keras.layers.Flatten()(input1)
x2 =tf.keras.layers.Flatten()(input2)
x = tf.keras.layers.concatenate([x1,x2])
x = tf.keras.layers.Dense(32,activation='relu')(x)
output = tf.keras.layers.Dense(32,activation='sigmoid')(x)#逻辑模型
model = tf.keras.Model(inputs = [input1,input2],outputs=output)
#这样函数API的形式有利于搭建多输入
加载数据集
(train_imagine,train_label),(test_imagine,test_label)= tf.keras.datasets.fashion_mnist.load_data()
优化器
tf.keras.optimizers.Adam()
存储模型
Saving/loading whole models (architecture + weights + optimizer state)
from keras.models import load_model
model.save('my_model.h5') # creates a HDF5 file 'my_model.h5'
del model # deletes the existing model
model = load_model('my_model.h5')
Saving/loading only a model’s architecture
# save as JSON
json_string = model.to_json()
# save as YAML
yaml_string = model.to_yaml()
# model reconstruction from JSON:
from keras.models import model_from_json
model = model_from_json(json_string)
# model reconstruction from YAML:
from keras.models import model_from_yaml
model = model_from_yaml(yaml_string)
Saving/loading only a model’s weights
model.save_weights('my_model_weights.h5')
model.load_weights('my_model_weights.h5')