深度学习的过程(监督学习)

分类问题

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')
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值