softmax_cross_entropy

在tensorflow中对于分类问题采取的损失函数常常使用cross_entropy损失函数,我们常用的函数如下所示

cross_entropy = tf.nn.softmax_cross_entropy_with_logits(logits=y_hat_tensor, labels=y_true)

其中,logits参数是用来填写神经网络输出层输出的tensor的,而labels是用来传入样本的真实标记的.函数最后返回的就是每一个样本的交叉熵.

虽然已经了解其中原理,但是突然想去自己写一下验证一下,于是用python自己对其实现了一下,并和tensorflow求取结果进行对比发现结果是一样的.在此进行记录一下作为学习笔记,代码如下:


# coding: utf-8

# In[1]:


import tensorflow as tf
import numpy as np
from numpy import random as rd
import pandas as pd


# In[2]:


np.set_printoptions(linewidth=10000, suppress=True)


# In[3]:


# y_hat表示神经网络的输出,构造三个样本点的输出,输出层有10个神经元代表10个类别
# y_true表示3个样本的真实标记,经过one_hot编码
y_hat = rd.uniform(-5, 5, (3, 10))
y_true = np.concatenate([np.eye(N=3), np.zeros([3, 7])], axis=1).T
rd.shuffle(y_true)
y_true = y_true.T


# In[4]:


print("三个样本的神经网络输出结果:\n", y_hat)
print("三个样本的真实标记:\n", y_true)


# In[5]:


def softmax_operation(y_hat):
    # 对三个样本进行softmax操作,使每个样本的输出服从一个概率分布
    return np.exp(y_hat) / np.sum(np.exp(y_hat), axis=1, keepdims=True)


# In[6]:


def cross_entropy_operation(y_hat_after_softmax, y_true):
    # 计算交叉熵
    return -np.sum(y_true * np.log(y_hat_after_softmax), axis=1, keepdims=True)


# In[7]:


y_hat_after_softmax = softmax_operation(y_hat)


# In[8]:


cross_entropy_result = cross_entropy_operation(y_hat_after_softmax, y_true)


# In[9]:


y_hat_tensor = tf.constant(y_hat, dtype=tf.float32)
cross_entropy = tf.nn.softmax_cross_entropy_with_logits(logits=y_hat_tensor, labels=y_true)
with tf.Session() as sess:
    cross_entropy_result_of_tensorflow = sess.run(cross_entropy)


# In[10]:


print("自定义函数计算结果:\n", cross_entropy_result)
print("tensorflow函数结果:\n", cross_entropy_result_of_tensorflow)

猜你喜欢

转载自blog.csdn.net/yy2050645/article/details/83962510