利用tensoflower研究激活函数对网络准确率的影响
1.数据集:mnist
2.网络:cnn
3.框架:tensorflow
cnn基础结构为:卷积层-》池化层-》卷积层-》池化层-》拉直-》全连接层-》输出层
其中卷积层、卷积层、全连接层、输出层,这四个层存在激励函数,在这里我选了常用
这6个激励函数’sigmoid’,‘tanh’,‘elu’,‘softmax’,‘relu’,‘linear’。然后通过遍历探究结果
import tensorflow as tf mnist=tf.keras.datasets.mnist # 下面三行是常规导入 from tensorflow import keras from tensorflow.keras import layers from tensorflow.keras import models #导入mnist数据集,需要保持网络畅通 (X_train, Y_train), (X_test, Y_test) = mnist.load_data() var1=['sigmoid','tanh','elu','softmax','relu','linear'] var2=['sigmoid','tanh','elu','softmax','relu','linear'] var3=['sigmoid','tanh','elu','softmax','relu','linear'] var4=['sigmoid','tanh','elu','softmax','relu','linear'] img_rows, img_cols = 28, 28 # 图像的尺寸 a=var1[5] # 训练数据;X_train是60000张28*28的数据,所以尺寸是60000*28*28,Y_train是对应的数字,尺寸是60000*1,X_test和Y_test同理 X_train, X_test = X_train / 255.0, X_test / 255.0 # 将图像像素转化为0-1的实数 # 将标准答案通过one-hot编码转化为需要的格式(这两个函数不懂见下个模块的介绍) Y_train = keras.utils.to_categorical(Y_train, num_classes=10) Y_test = keras.utils.to_categorical(Y_test, num_classes=10) # 将训练所用的图像调整尺寸,由于图像是黑白图像,所以最后一维的值是1 X_train = X_train.reshape(X_train.shape[0], img_rows, img_cols, 1) X_test = X_test.reshape(X_test.shape[0], img_rows, img_cols, 1) max=0 min=1 ############################### ### 使用keras API开始定义模型 ### ############################## for i in range(0,1): for j in range(0,2): for p in range(0,6): for q in range(0,6): model = models.Sequential() # 向模型中添加层 model.add(layers.Conv2D(32, kernel_size=(5,5), # 添加卷积层,深度32,过滤器大小5*5 activation=var1[i], # 使用relu激活函数 input_shape=(img_rows, img_cols, 1))) # 输入的尺寸就是一张图片的尺寸(28,28,1) model.add(layers.MaxPooling2D(pool_size=(2, 2))) # 添加池化层,过滤器大小是2*2 model.add(layers.Conv2D(64, (5,5), activation=var2[j])) # 添加卷积层,简单写法 model.add(layers.MaxPooling2D(pool_size=(2, 2))) # 添加池化层 model.add(layers.Flatten()) # 将池化层的输出拉直,然后作为全连接层的输入 model.add(layers.Dense(500, activation=var3[p]最终发现如下的组合单次训练后结果比较好:)) # 添加有500个结点的全连接层 model.add(layers.Dense(10, activation=var4[q])) # 输出最终结果,有10个 # 定义损失函数、优化函数、评测方法 model.compile(loss=keras.losses.categorical_crossentropy, optimizer=keras.optimizers.SGD(), metrics=['accuracy']) # 自动完成模型的训练过程 model.fit(X_train, Y_train, # 训练集 batch_size=128, # batchsize epochs=20, # 训练轮数 validation_data=(X_test, Y_test)) # 验证集 # 打印运行结果,即损失和准确度 score = model.evaluate(X_test, Y_test) if max<=score[1]: max=score[1] maxnum=var1[i]+' '+var2[j]+' '+var3[p]+' '+var4[q] if min>=score[1]: min=score[1] minnum=var1[i]+' '+var2[j]+' '+var3[p]+' '+var4[q] print('Test loss:', score[0]) print(var1[i]+' '+var2[j]+' '+var3[p]+' '+var4[q]+'Test accuracy:', score[1]) print(maxnum,max) print(minnum,min)
1.tanh tanh linear softmax 0.9024999737739563
2.tanh elu linear softmax 0.916100025177002
3.tanh relu elu softmax 0.9189000129699707
4.elu tanh linear softmax 0.9142000079154968
5.elu elu tanh softmax 0.9168000221252441
6.elu relu tanh softmax 0.9240000247955322
7.relu tanh linear softmax 0.9164000153541565
8.relu elu linear softmax 0.9193000197410583
9.relu relu linear softmax 0.9235000014305115
10.linear tanh linear softmax 0.9129999876022339
11.linear elu relu softmax 0.9178000092506409
12.linear relu tanh softmax 0.9239000082015991
从中发现训练结果中的输出层采用softmax是最好的
- 感知机相关;利用tensorflow等工具定义简单的几层网络(激活函数sigmoid),递归使用链式法则来实现反向传播。
- DL之DNN优化技术:采用三种激活函数(sigmoid、relu、tanh)构建5层神经网络,权重初始值(He初始化和Xavier初始化)影响隐藏层的激活值分布的直方图可视化
- 神经网络常用激活函数对比:sigmoid VS sofmax(附python源码)
- 神经网络中激活函数的作用及选择
- 深度学习/神经神经网络常用激活函数总结
- 神经网络激活函数的作用是什么
- 神经网络激活函数的作用是什么
- 神经网络激活函数的作用是什么
- 机器学习总结(七):基本神经网络、BP算法、常用激活函数对比
- 深度残差网络+自适应参数化ReLU激活函数:调参记录13
- AndrewNg神经网络和深度学习笔记-Week3-6激活函数
- 神经网络激活函数的作用是什么
- 神经网络之激活函数(sigmoid、tanh、ReLU)
- 神经网络的激活函数总结
- 利用神经网络逼近sin(x)函数
- 笔记+R︱信用风险建模中神经网络激活函数与感知器简述
- 神经网络激活函数的作用
- 神经网络-激活函数对比
- 【Stanford CNN课程笔记】5. 神经网络解读1 几种常见的激活函数
- 【机器学习】神经网络-激活函数-面面观(Activation Function)