TensorFlow之四(将准确度提升至98%(optimizer、lr))

TensorFlow第四课如何将准确度提升至98%

如何将准确度提升至98%以上,在这里使用到了优化器的选择以及学习率的设置

# -*- coding: utf-8 -*-
"""
Created on Mon Oct 22 14:51:33 2018
如何将准确度提升至98以上
@author: dj
"""
import tensorflow as tf 
from tensorflow.examples.tutorials.mnist import input_data

#载入数据集
mnist=input_data.read_data_sets("MNIST_data",one_hot=True)

#每个批次的大小
batch_size=100
#计算一共有多少个批次
n_batch=mnist.train.num_examples//batch_size
#定义两个placeholder
x=tf.placeholder(tf.float32,[None,784])#一张图片拉为784列,行不确定none为100,下一步对none进行赋值
y=tf.placeholder(tf.float32,[None,10])#标签0-910个数
keep_prob=tf.placeholder(tf.float32)#用来设置的dropout
lr=tf.Variable(0.001,dtype=tf.float32)
#创建一个神经网络
#初始化环节
W1=tf.Variable(tf.truncated_normal([784,500],stddev=0.1))
b1=tf.Variable(tf.zeros([500])+0.1)#偏置初始化可以调为0.1
l1=tf.nn.tanh(tf.matmul(x,W1)+b1)
l1_drop=tf.nn.dropout(l1,keep_prob)

W2=tf.Variable(tf.truncated_normal([500,300],stddev=0.1))
b2=tf.Variable(tf.zeros([300])+0.1)
l2=tf.nn.tanh(tf.matmul(l1_drop,W2)+b2)
l2_drop=tf.nn.dropout(l2,keep_prob)

W3 = tf.Variable(tf.truncated_normal([300,10],stddev=0.1))
b3 = tf.Variable(tf.zeros([10])+0.1)
prediction = tf.nn.softmax(tf.matmul(l2_drop,W3)+b3)
#二次代价函数
#loss=tf.reduce_mean(tf.square(y-prediction))
#交叉熵损失
loss=tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y,logits=prediction))
#定义一个梯度下降发进行训练的优化器学习率0.2
#optimizer=tf.train.GradientDescentOptimizer(0.1)
optimizer=tf.train.AdamOptimizer(1e-2)#0.01
#最小化代价函数
train_step=optimizer.minimize(loss)

init=tf.global_variables_initializer()

#求准确率的方法,结果存放在一个布尔型列表中
correct_prediction=tf.equal(tf.argmax(y,1),tf.argmax(prediction,1))#argmax返回函数中最大的值所在的位置
#求准确率
accuracy=tf.reduce_mean(tf.cast(correct_prediction,tf.float32))
with tf.Session() as sess:
    sess.run(init)
    #所有图片训练21次
    for epoch in range(50):
        sess.run(tf.assign(lr,0.001*(0.95**epoch)))#这里使用每将所有图片训练一次后对学习率乘0.95,改变学习率
        for batch in range(n_batch):#所有循环一次
            batch_xs,batch_ys=mnist.train.next_batch(batch_size)
            sess.run(train_step,feed_dict={x:batch_xs,y:batch_ys,keep_prob:1.0})#keep_prob:1.0没有用到dropout
        
        learning_rate=sess.run(lr)
        acc=sess.run(accuracy,feed_dict={x:mnist.test.images,y:mnist.test.labels,keep_prob:1.0})
        
        print('iter '+str(epoch)+'testing Accuracy '+str(acc)+',learning_rate '+str(learning_rate))  
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这是一个分类问题,我们可以使用深度学习中的神经网络来解决。以下是解决该问题的步骤: 1. 数据预处理 首先,我们需要导入需要的库和数据集,并进行一些预处理。因为我们的数据集是图片,所以我们需要将其转换为数字张量表示。我们将其缩放到0到1之间,这有助于网络更轻松地学习模式。 ```python import numpy as np import pandas as pd from sklearn.model_selection import train_test_split from tensorflow.keras.utils import to_categorical # 加载数据集 data = pd.read_csv('data.txt', header=None, sep=',') labels = pd.read_csv('label.txt', header=None) # 将数据转换为数字张量表示(缩放到0-1之间) X = data.values.astype('float32') / 255.0 y = to_categorical(labels.values) # 对数据集进行随机分割 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) ``` 2. 建立模型 我们将使用神经网络来解决该问题。具体来说,我们将使用多层感知器(MLP)模型。MLP在图像分类问题上表现出色,因为它们可以捕获图像中的空间结构。下面是一个简单的MLP模型的代码: ```python from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense, Dropout # 创建一个Sequential模型 model = Sequential() # 添加隐藏层和Dropout层 model.add(Dense(256, activation='relu', input_shape=(X_train.shape[1],))) model.add(Dropout(0.5)) model.add(Dense(128, activation='relu')) model.add(Dropout(0.5)) # 添加输出层 model.add(Dense(y_train.shape[1], activation='softmax')) # 打印模型的摘要信息 model.summary() ``` 3. 训练模型 现在,我们可以使用训练集来训练我们的模型。我们将使用交叉熵损失函数和Adam优化器来训练我们的模型。我们还将记录模型在训练集和验证集上的准确率。 ```python from tensorflow.keras.optimizers import Adam # 编译模型 model.compile(loss='categorical_crossentropy', optimizer=Adam(lr=0.001), metrics=['accuracy']) # 训练模型 history = model.fit(X_train, y_train, batch_size=128, epochs=10, validation_split=0.2) ``` 4. 评估模型 最后,我们可以使用测试集来评估我们的模型的性能。我们将计算模型的精度,精确度,召回率和F1分数。 ```python from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score # 对测试集进行预测 y_pred = model.predict(X_test) # 将预测结果转换为标签 y_pred = np.argmax(y_pred, axis=1) y_test = np.argmax(y_test, axis=1) # 计算精度、精确度、召回率和F1分数 accuracy = accuracy_score(y_test, y_pred) precision = precision_score(y_test, y_pred, average='macro') recall = recall_score(y_test, y_pred, average='macro') f1 = f1_score(y_test, y_pred, average='macro') # 打印结果 print('Accuracy: {:.2f}%'.format(accuracy * 100)) print('Precision: {:.2f}%'.format(precision * 100)) print('Recall: {:.2f}%'.format(recall * 100)) print('F1 Score: {:.2f}%'.format(f1 * 100)) ``` 这样就完成了整个流程。希望这能帮助到你!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值