神经网络的学习

神经网络的学习

#导入模块
from sklearn import datasets
import tensorflow as tf
import pandas as pd
from pandas import DataFrame
import numpy as np
from matplotlib import pyplot as  plt   

#导入数据集
x_data = datasets.load_iris().data
y_data = datasets.load_iris().target

#打乱数据集的顺序
np.random.seed(116)
np.random.shuffle(x_data)
np.random.seed(116)
np.random.shuffle(y_data)

#定义训练集和测集
x_tarin = x_data[: -30]
y_train = y_data[: -30]
x_test = x_data[-30:]
y_test = y_data[-30:]

#转换数据类型使其一致
x_tarin = tf.cast(x_tarin, tf.float32)
x_test = tf.cast(x_test, tf.float32)

#分批次导入数据
train_db = tf.data.Dataset.from_tensor_slices((x_tarin, y_train)).batch(32)
test_db = tf.data.Dataset.from_tensor_slices((x_test, y_test)).batch(32)

#定义变量
w1 = tf.Variable(tf.random.truncated_normal([4, 3], stddev= 0.1, seed= 1))
b1 = tf.Variable(tf.random.truncated_normal([3], stddev= 0.1, seed= 1))

lr = 0.2   #学习率
train_loss_results = [] #损失结果
test_acc = []
epoch = 1000 
loss_all = 0

for epoch in range(epoch):
    for step, (x_tarin, y_train) in enumerate(train_db):
        with tf.GradientTape() as tape:
            y = tf.matmul(x_tarin, w1) + b1
            y = tf.nn.softmax(y)
            y_ = tf.one_hot(y_train, depth=3)
            loss = tf.reduce_mean(tf.square(y_ - y))
            loss_all += loss.numpy()
        grads = tape.gradient(loss, [w1, b1])

    w1.assign_sub(lr * grads[0])
    b1.assign_sub(lr * grads[1])

    print("epoch {}, loss: {}".format(epoch, loss_all/4))
    train_loss_results.append(loss_all / 4)
    loss_all = 0

    total_correct, total_number = 0 , 0
    for x_test, y_test in test_db:
        y = tf.matmul(x_test, w1)+ b1
        y = tf.nn.softmax(y)
        pred = tf.argmax(y, axis= 1)
        pred = tf.cast(pred, dtype=y_test.dtype)

        correct = tf.cast(tf.equal(pred, y_test), dtype= tf.int32)
        correct = tf.reduce_sum(correct)
        total_correct += int(correct)
        total_number += x_test.shape[0]

    acc = total_correct / total_number
    test_acc.append(acc)
    print("test acc is ", acc)
    print("---------------------------------------")

plt.title("loss function curve")
plt.xlabel("epoch")
plt.ylabel("loss")
plt.plot(train_loss_results, label = "LOSS")
plt.legend()
plt.show()

plt.title("Accuracy Curve")
plt.xlabel("epoch")
plt.ylabel("acc")
plt.plot(test_acc, label= "ACC")
plt.legend()
plt.show()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值