(P6)如何用keras产生一个合适的模型【配置optimizer】

本文介绍了如何使用Keras构建一个过拟合的模型,并通过增加层数、增大层大小、训练轮次来加剧过拟合。接着探讨了抑制过拟合的策略,如Dropout、正则化以及图像增强。在fashionmnist数据集上的实验显示,Dropout层有效地减少了过拟合现象。
摘要由CSDN通过智能技术生成

步骤

(A)首先开发一个过拟合的模型

(1)添加更多的层 --最有用
(2)让每一层变得更大
(3)训练更多的轮次

(B)抑制过拟合(没有足够数据的情况)

(1)dropout
(2)正则化
(3)图像增强

(C)再次调节超参数

(1)learning rate
(2)隐藏层单元数
(3)训练轮次

fashionminst数据集的一次尝试

首先,先用很多层和单元,看看是否过拟合
import tensorflow as tf
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

(train_image, train_label), (test_image, test_label) = tf.keras.datasets.fashion_mnist.load_data()

#进行归一化处理
train_image = train_image/255
test_image = test_image/255

# 将label转化为onehot的编码形式
train_label_onehot = tf.keras.utils.to_categorical(train_label)
test_label_onehot = tf.keras.utils.to_categorical(test_label)

# 在原来的基础上多加上两个隐藏层
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(128, activation='relu'))
model.add(tf.keras.layers.Dense(128, activation='relu'))
model.add(tf.keras.layers.Dense(10, activation='softmax'))

model.compile(optimizer=tf.keras.optimizers.Adam(lr=0.001),
              loss='categorical_crossentropy',
              metrics=['acc']
              )

# 记录下训练过程,记录下测试集的 loss和 accuracy
history = model.fit(train_image, train_label_onehot,
                    epochs=10,
                    validation_data=(test_image, test_label_onehot))

# 看看过拟合在loss上面的体现
print(history.history.keys()) # 看看fit过程中有哪些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() # 给图像加上图例
plt.show()

# 看看过拟合在acc上面的体现
plt.plot(history.epoch, history.history.get('acc'), label='acc')
plt.plot(history.epoch, history.history.get('val_acc'), label='val_acc')
plt.legend() # 给图像加上图例
plt.show()

与上一次的模型相比,这次多增加了两个隐藏层
让我们来看看训练集和测试集的loss和accuracy
在这里插入图片描述
在这里插入图片描述
可以看到训练集上的loss一直在下降,但是测试集上的loss到了第六次以后不降反升
同样accurary,训练集一直上升,测试集到了后面也下降
这说明了过拟合了

加入3个Dropout层看看效果
import tensorflow as tf
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

(train_image, train_label), (test_image, test_label) = tf.keras.datasets.fashion_mnist.load_data()

#进行归一化处理
train_image = train_image/255
test_image = test_image/255

# 将label转化为onehot的编码形式
train_label_onehot = tf.keras.utils.to_categorical(train_label)
test_label_onehot = tf.keras.utils.to_categorical(test_label)

# 在原来的基础上多加上两个隐藏层
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.3))
model.add(tf.keras.layers.Dense(128, activation='relu'))
model.add(tf.keras.layers.Dropout(0.3))
model.add(tf.keras.layers.Dense(128, activation='relu'))
model.add(tf.keras.layers.Dropout(0.3))
model.add(tf.keras.layers.Dense(10, activation='softmax'))

model.compile(optimizer=tf.keras.optimizers.Adam(lr=0.001),
              loss='categorical_crossentropy',
              metrics=['acc']
              )

# 记录下训练过程,记录下测试集的 loss和 accuracy
history = model.fit(train_image, train_label_onehot,
                    epochs=10,
                    validation_data=(test_image, test_label_onehot))

# 看看过拟合在loss上面的体现
print(history.history.keys()) # 看看fit过程中有哪些keys
plt.plot(history.epoch, history.history.get('loss'), label='loss')
plt.plot(history.epoch, history.history.get('val_loss'), label='val_loss')
plt.legend() # 给图像加上图例
plt.show()

# 看看过拟合在acc上面的体现
plt.plot(history.epoch, history.history.get('acc'), label='acc')
plt.plot(history.epoch, history.history.get('val_acc'), label='val_acc')
plt.legend() # 给图像加上图例
plt.show()

在这里插入图片描述
在这里插入图片描述
与前面的对比,可以看到很好地减少了过拟合

通过正则化的方法来减小过拟合
tf.keras.layers.Dense(128, activation='relu', kernel_regularizer=2)

在这里插入图片描述
就是开过改Dense()中的kernel_regularizer这个参数来控制的,用的不是很多,不做了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个使用Keras训练MNIST手写数字识别模型的示例代码,该代码使用GPU进行计算: ```python import tensorflow as tf from keras.backend.tensorflow_backend import set_session from keras.datasets import mnist from keras.models import Sequential from keras.layers import Dense, Dropout, Flatten from keras.layers import Conv2D, MaxPooling2D from keras.utils import np_utils # 设置GPU选项 config = tf.ConfigProto() config.gpu_options.allow_growth = True sess = tf.Session(config=config) set_session(sess) # 加载MNIST数据集 (X_train, y_train), (X_test, y_test) = mnist.load_data() # 将数据集变形为符合CNN的输入格式 X_train = X_train.reshape(X_train.shape[0], 28, 28, 1) X_test = X_test.reshape(X_test.shape[0], 28, 28, 1) input_shape = (28, 28, 1) # 将标签转换为独热编码 y_train = np_utils.to_categorical(y_train, 10) y_test = np_utils.to_categorical(y_test, 10) # 构建模型 model = Sequential() model.add(Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=input_shape)) model.add(Conv2D(64, (3, 3), activation='relu')) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Dropout(0.25)) model.add(Flatten()) model.add(Dense(128, activation='relu')) model.add(Dropout(0.5)) model.add(Dense(10, activation='softmax')) # 编译模型 model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) # 训练模型 model.fit(X_train, y_train, batch_size=128, epochs=10, verbose=1, validation_data=(X_test, y_test)) # 评估模型 score = model.evaluate(X_test, y_test, verbose=0) print('Test loss:', score[0]) print('Test accuracy:', score[1]) ``` 在这个例子中,我们使用了两个CNN层和一个Dense层来构建模型,使用GPU进行训练。在训练过程中,我们设置了batch_size和epochs等参数,使用了验证集来评估模型的性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值