利用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是最好的

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

掉了牙的大黄狗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值