目录
一、学习目标
- 掌握Keras构建网络的方法
- 理解不同的激活函数
二、学习内容
对cifar10数据库(10类),做如下实验:
- 构建合适的全连接网络结构进行分类,并定义一个自定义的全连接层加入到网络中。
- 选择使用不同的激活函数,比如relu、sigmoid、softmax,并对比结果。
三、学习过程
1.自定义的全连接层代码:
2.使用自定义全连接层的对象,并使用不同的激活函数的效果:
激活函数使用relu:
激活函数使用sigmoid:
激活函数使用softmax:
激活函数使用softplus:
激活函数使用softsign:
激活函数使用tanh:
激活函数使用selu:
激活函数使用elu:
激活函数使用exponential:
四、源码
#导入cifar10数据集
from tensorflow.keras.datasets import cifar10
from tensorflow.keras import utils
(x_train, y_train), (x_test, y_test) = cifar10.load_data()
y_train=utils.to_categorical(y_train,num_classes=10)
y_test=utils.to_categorical(y_test,num_classes=10)
x_train,x_test = x_train/255.0, x_test/255.0
# In[1]:
# 自定义层
import tensorflow as tf
from tensorflow.keras.layers import Layer
class SimpleDense(Layer):
def __init__(self, units=32):
super(SimpleDense, self).__init__()
self.units = units
def build(self, input_shape): # 创建权重weights
self.w = self.add_weight(shape=(input_shape[-1], self.units),
initializer='random_normal',
trainable=True)
self.b = self.add_weight(shape=(self.units,),
initializer='random_normal',
trainable=True)
def call(self, inputs): # 定义从输入到输出的计算过程
return tf.matmul(inputs, self.w) + self.b
# In[2]:
from tensorflow.keras import Sequential,Input,layers,optimizers
model = Sequential()
model.add(Input(shape=(32,32,3)))
model.add(layers.Reshape((32*32*3,)))
#model.add(layers.Dense(512,activation='relu'))
#用不同的激活函数
model.add(SimpleDense(512));
#改变中间层的激活函数
model.add(layers.Activation('relu'))
#model.add(layers.Activation('sigmoid'))
#model.add(layers.Activation('softmax'))
#model.add(layers.Activation('softplus'))
#model.add(layers.Activation('softsign'))
#model.add(layers.Activation('tanh'))
#model.add(layers.Activation('selu'))
#model.add(layers.Activation('elu'))
#model.add(layers.Activation('exponential'))
#model.add(layers.Activation('selu'))
model.add(layers.Dense(10,activation='softmax')) #最后一层的激活函数不变
#学习率改为0.005
optimizer = optimizers.SGD(lr=0.005)
model.compile(optimizer,loss='categorical_crossentropy',metrics=['accuracy'])
# In[3]:
#迭代8次
model.fit(x_train, y_train, batch_size=128, epochs=8)
print('\nTesting ------------------- ')
# model.load_weights('mymodel.h5')
loss, accuracy = model.evaluate(x_test, y_test)
五、学习产出
- 测试出来的结果是使用relu、tanh和selu这些激活函数的准确率最好,使用exponential激活函数的准确率最低;
- 总的来说,激活函数选择relu来测试的准确率较好。