tensorflow/keras与pytorch的交叉熵对比

pytorch交叉熵损失

BCELoss vs BCEWithLogitsLoss

bceloss前面需要经过sigmoid

BCEWithLogitsLoss就是把Sigmoid-BCELoss合成一步

input = torch.tensor(np.arange(3)/3).reshape(3,1)
input2 = torch.nn.Sigmoid()(input)
loss = torch.nn.BCELoss()
target = torch.tensor([[0],[1],[1]]).to(torch.double)
print(loss(input2,target))

loss = torch.nn.BCEWithLogitsLoss()
print (loss(input,target))
#输出
#tensor(0.5493, dtype=torch.float64)
#tensor(0.5493, dtype=torch.float64)

nll_loss和cross_entropy loss

和上面一样,CrossEntropyLoss就是把以上Softmax–Log–NLLLoss合并成一步,注意这里还需要多经过一层log

input = torch.randn(3,3)
input2 = torch.log(torch.nn.Softmax(dim=1)(input))
loss = torch.nn.NLLLoss()
target = torch.tensor([0,2,1])
print(loss(input2,target))

loss = torch.nn.CrossEntropyLoss()
print (loss(input,target))
#输出
#tensor(1.0774)
#tensor(1.0774)

tensorflow/keras交叉熵损失

这里就只讨论多分类的

sparse_categorical_crossentropy 与 sparse_softmax_cross_entropy_with_logits

这个函数对应pytorch的cross_entropy

在tensorflow里的"logits"指的其实是,该方法是在logit数值上使用softmax或者sigmoid来进行normalization的,也暗示用户不要将网络输出进行sigmoid或者softmax,这些过程可以在函数内部更高效地计算。

在torch里:

outputs=torch.tensor([[[1.4,1.2],[0.0,0.0],[0.3,1.8],[0.3,0.0]],[[1.4,1.2],[0.0,0.0],[0.3,1.8],[0.3,0.0]]]).to(torch.float32)
labels =torch.tensor([[0,0],[0,0]])
loss =  torch.nn.CrossEntropyLoss()(outputs, labels)
loss,outputs.shape,labels.shape
#输出
#(tensor(0.9396), torch.Size([2, 4, 2]), torch.Size([2, 2]))

在tensorflow/keras里,tf里的sparse_softmax_cross_en

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
好的,我可以为您提供一些代码示例和步骤来完成这个任务。 首先,您需要下载并导入所需的软件包,包括`numpy`、`pandas`、`matplotlib`、`scikit-learn`和`tensorflow`或`pytorch`。您还需要下载并解压Kaggle上的胸部X光图像数据集。 接下来,您需要加载和预处理数据。在这个数据集中,您将有两个子目录,分别是`train`和`test`。`train`子目录包含训练图像,`test`子目录包含测试图像。每个子目录都有两个子文件夹,分别是`NORMAL`和`PNEUMONIA`,其中`NORMAL`文件夹包含正常的胸部X光图像,`PNEUMONIA`文件夹包含有肺炎的胸部X光图像。 您可以使用以下代码来加载和预处理数据: ```python import os import cv2 import numpy as np from sklearn.model_selection import train_test_split # Load data data = [] labels = [] PNEUMONIA_path = "./chest_xray/train/PNEUMONIA/" NORMAL_path = "./chest_xray/train/NORMAL/" for img in os.listdir(NORMAL_path): img_path = os.path.join(NORMAL_path, img) img = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE) img = cv2.resize(img, (224, 224)) data.append(img) labels.append(0) for img in os.listdir(PNEUMONIA_path): img_path = os.path.join(PNEUMONIA_path, img) img = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE) img = cv2.resize(img, (224, 224)) data.append(img) labels.append(1) # Convert to numpy array data = np.array(data) / 255.0 labels = np.array(labels) # Split data into train and validation sets train_data, val_data, train_labels, val_labels = train_test_split(data, labels, test_size=0.2, random_state=42) ``` 在上面的代码中,我们首先定义了两个变量`PNEUMONIA_path`和`NORMAL_path`,分别指向包含有肺炎和正常胸部X光图像的子目录。然后,我们遍历每个子目录中的图像,并将其读取为灰度图像,然后调整大小为`224x224`。我们还将标签存储在一个名为`labels`的列表中,其中0表示正常,1表示肺炎。最后,我们将数据和标签转换为NumPy数组,并将数据集拆分为训练和验证集。 现在,您可以尝试使用不同的分类方法来对数据进行分类和预测。下面是三种不同的分类方法示例: ## 1. Logistic Regression ```python from sklearn.linear_model import LogisticRegression from sklearn.metrics import classification_report # Train model lr = LogisticRegression() lr.fit(train_data.reshape(train_data.shape[0], -1), train_labels) # Evaluate model on validation set val_preds = lr.predict(val_data.reshape(val_data.shape[0], -1)) print(classification_report(val_labels, val_preds)) ``` 上面的代码使用scikit-learn中的逻辑回归模型进行分类。我们首先将训练数据`train_data`转换为二维数组,然后使用`fit`方法来训练模型。接下来,我们使用验证数据`val_data`进行预测,并使用`classification_report`函数生成分类报告。 ## 2. Support Vector Machine (SVM) ```python from sklearn.svm import SVC from sklearn.metrics import classification_report # Train model svm = SVC() svm.fit(train_data.reshape(train_data.shape[0], -1), train_labels) # Evaluate model on validation set val_preds = svm.predict(val_data.reshape(val_data.shape[0], -1)) print(classification_report(val_labels, val_preds)) ``` 上面的代码使用scikit-learn中的支持向量机模型进行分类。我们使用与逻辑回归相同的方法来训练模型并进行预测,然后使用`classification_report`函数生成分类报告。 ## 3. Convolutional Neural Network (CNN) ```python import tensorflow as tf from keras.utils import to_categorical from keras.models import Sequential from keras.layers import Dense, Conv2D, MaxPooling2D, Flatten # Convert labels to one-hot encoding train_labels = to_categorical(train_labels) val_labels = to_categorical(val_labels) # Build CNN model cnn = Sequential() cnn.add(Conv2D(32, (3,3), activation='relu', input_shape=(224, 224, 1))) cnn.add(MaxPooling2D((2,2))) cnn.add(Conv2D(64, (3,3), activation='relu')) cnn.add(MaxPooling2D((2,2))) cnn.add(Conv2D(128, (3,3), activation='relu')) cnn.add(MaxPooling2D((2,2))) cnn.add(Conv2D(256, (3,3), activation='relu')) cnn.add(MaxPooling2D((2,2))) cnn.add(Flatten()) cnn.add(Dense(128, activation='relu')) cnn.add(Dense(2, activation='softmax')) # Compile model cnn.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy']) # Train model cnn.fit(train_data.reshape(train_data.shape[0], 224, 224, 1), train_labels, epochs=10, batch_size=32, validation_data=(val_data.reshape(val_data.shape[0], 224, 224, 1), val_labels)) # Evaluate model on validation set val_loss, val_acc = cnn.evaluate(val_data.reshape(val_data.shape[0], 224, 224, 1), val_labels) print("Validation loss:", val_loss) print("Validation accuracy:", val_acc) ``` 上面的代码使用KerasTensorFlow构建了一个卷积神经网络模型。我们首先将标签转换为独热编码,并定义了一个包含四个卷积层和两个全连接层的CNN模型。我们使用`adam`优化器和交叉熵损失函数来编译模型,并在训练集上训练模型。最后,我们使用验证数据集评估模型,并输出损失和准确率。 在这三种不同的分类方法中,CNN模型的表现最好。您可以尝试调整模型的超参数,例如卷积层的数量和大小,全连接层的大小和dropout等,以提高模型的性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值