深度学习的过程(监督学习)
分类问题
1. 数据集分类:
1.1首先把数据集分成X集和Y集。X集为数据,Y集为对应的标签。
如:mnist,X集为60000张,像素为28*28的图片。
Y集为一个1*60000的一维数组,[8,9,0,1,2,3,……]。
1.2我们需要把数据集的一部分作为训练集,一部分作为测试集。通常拿80%的数据做数据集,20%的数据做测试集。(可以在原始数据里分,也可以用代码去分)
from sklearn.model_selection import train_test_split
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.80, random_state=42)
2、 处理数据(处理X集)
2.1 reshape
原则:数组的形状要与之后添加的神经网络保持一致
如:我们只添加密集连接层(Dense),输入的X集应该为一维数组。
X_train = X_train.reshape((60000, 28 * 28))
X_test = X_test.reshape((10000, 28 * 28))
如果添加卷积层(Conv2D),输入的X集应该为三位数组。
X_train = X_train.reshape((60000, 28, 28, 1))
X_test = X_test.reshape((10000, 28, 28, 1))
2.2 归一化
把所有的数据都转换到0到1之间
scaler = MinMaxScaler( )
scaler.fit(X_train)
scaler.data_max_
X_train=scaler.transform(X_train)
scaler = MinMaxScaler( )
scaler.fit(X_test)
scaler.data_max_
X_test =scaler.transform(X_test)
3. 处理标签(处理Y集)
如果是二分类问题,只有两类(0,1),就不用处理标签。
如果是多分类问题,需要把标签转换成one_hot编码。
Y_train = to_categorical(Y_train)
Y_test = to_categorical(Y_test)
4. 加入隐藏层,构建神经网络
例1、只添加密集连接层
network = models.Sequential()
network.add(layers.Dense(512, activation='relu', input_shape=(28 * 28,)))
network.add(layers.Dense(10, activation='softmax'))
例2、构建卷积神经网络
model = models.Sequential()
#加入卷积层
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)))
#加入最大池化层
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
#将数据展平成一维数组
model.add(layers.Flatten())
#加入密集连接层
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(10, activation='softmax'))
对于构建神经网络,我们要根据数据的类型选择最适合的神经网络。如前馈神经网络(FNN)、循环神经网络(RNN)、卷积神经网络(CNN)。
5. 编译
from keras import optimizers
sgd = optimizers.SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
network.compile(optimizer=sgd, loss='categorical_crossentropy',metrics=['accuracy'])
sgd为优化器(原理是梯度降低法或者是反向传播法),lr为学习率,也就是步长,decay为每迭代一次学习率减少的大小。
Loss是损失函数,分类问题用交叉熵损失函数(categorical_crossentropy),或者对数损失函数(binary_crossentropy)。
Metrics是在训练和测试过程中需要监控的指标,accuracy是监控精度
6. 拟合
拿出10000个数据作为验证集
x_val = x_train[:10000]
partial_x_train = x_train[10000:]
y_val = y_train[:10000]
partial_y_train = y_train[10000:]
history=model.fit(partial_x_train,partial_y_train,epochs=5,batch_size=,validation_data=(x_val, y_val))
7. 测试集精度
test_loss, test_acc = network.evaluate(X_test, Y_test)
print('test_acc:', test_acc)
8. 绘制损失函数与精确度图像
import matplotlib.pyplot as plt
from mpl_toolkits.axisartist.axislines import SubplotZero
acc = history.history['accuracy']
val_acc = history.history['val_accuracy']
loss = history.history['loss']
val_loss = history.history['val_loss']
epochs = range(1, len(acc) + 1)
plt.plot(epochs, acc, 'bo', label='Training acc')
plt.plot(epochs, val_acc, 'b', label='Validation acc')
plt.title('Training and validation accuracy')
plt.legend()
plt.figure()
plt.plot(epochs, loss, 'bo', label='Training loss')
plt.plot(epochs, val_loss, 'b', label='Validation loss')
plt.title('Training and validation loss')
plt.legend()
plt.show()
解决过拟合的方法:1、增大数据集 2、如果数据集比较小,用Dropout防止过拟合。
例:
9. 保存模型、调用模型进行预测
network.save('mnist_model.h5')
from keras.models import load_model
model = load_model(mnist _model.h5')
def prepare(path):
img=np.array(Image.open(path))
image = img.reshape((60000, 28 * 28))
return images = train_images.astype('float32') / 255
prediction = model.predict([prepare('1.jpg')])
print(prediction)
回归问题
以预测波士顿房价为例
1. 加载数据
from keras.datasets import boston_housing
(train_data, train_targets), (test_data, test_targets) = boston_housing.load_data()
>>> train_data.shape
(404, 13)
>>> test_data.shape
(102, 13)
训练集有404个样本,每个样本有13个特征值。测试集有102个样本。标签为对应的房价。
2. 数据标准化
对于每个特征值使其平均值为0,标准差为1.
mean = train_data.mean(axis=0)
train_data -= mean
std = train_data.std(axis=0)
train_data /= std
test_data -= mean
test_data /= std
3.构建网络
from keras import models
from keras import layers
def build_model():
model = models.Sequential()
model.add(layers.Dense(64, activation='relu', input_shape=(train_data.shape[1],)))
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(1))
model.compile(optimizer='rmsprop', loss='mse', metrics=['mae'])
return model
选择激活函数为relu,线性的激活函数
损失函数为mse,均方误差
监控指标为mae,平均绝对值误差
之后拟合、绘制曲线、保存调用模型与分类问题一样
model = build_model()
model.fit(train_data, train_targets, epochs=80, batch_size=16, verbose=0)
test_mse_score, test_mae_score = model.evaluate(test_data, test_targets)
network.save('Boston_housing_model.h5')