【hw1】b站刘二大人,第八讲课后题Titanic

2023-11-13

【pre】

代码没啥新意,很多人都分享过了。主要想记录一下自己遇到的bug以及收获。

【bug】

1. RuntimeError: mat1 and mat2 shapes cannot be multiplied (32x5 and 6x3)

nn.linear() 中,两参数(矩阵)的维度不一致。

FC公式:y=w*x+b,所以这里报错的原因是w和x维度不一致。

print了一下,发现x是5列,但源代码里作者认为是6列——五个特征转化为了6维,因为get_dummies将性别这一个特征用两个维度来表示,即男性[1,0],女性[0,1]”。

可能是数据集的差异吧,我这里print后发现,性别直接用了0,1来表示,所以还是5维。

于是把线性层的输入改成了5。

问题解决,跑起来了。

【tips】

1.离散数据编码方式总结

根据某一feature的值之间有无大小关系,从而决定使用数字编码或是one-hot编码方式。(​​​​​​参考

2.优化神经网络参考

(1)梯度下降算法(本文用了mini-batch)

(2)BP算法

在网络的训练过程中经过前向传播后得到的最终结果跟训练样本的真实值总是存在一定误差,这个误差便是损失函数。想要减小这个误差,就从后往前,依次求各个参数的偏导,这就是反向传播(Back Propagation)。BP算法与梯度下降算法相结合,对网络中所有权重计算损失函数的梯度,并利用梯度值来更新权值以最小化损失函数。

(3)学习率退火(参考12

每一个参数对目标函数的依赖不同——有的参数已经优化到了极小值附近,有的参数仍然有很大的梯度,所以不能使用统一学习率。

学习率太小,会有一个很慢的收敛速度,学习率很大,会使已经优化的差不多的参数不稳定。

一般合理的做法是对每一个参数设置不同的学习率。

*优化梯度下降算法:

 -动量算法(Momentum)——解决鞍点

-adaGrad

-RMSProp

-Adam

【代码】

'''
b站刘二大人第8讲的课后作业

'''

import numpy as np
import pandas as pd
import torch 
import matplotlib.pyplot as plt
from torch.utils.data import Dataset # 抽象类 被继承
from torch.utils.data import DataLoader # 加载数

'''

prepare dataset

'''
class TitanicDataset(Dataset):
    
    def __init__(self,filepath):
        xy = pd.read_csv(filepath) 
        self.len = xy.shape[0] # xy.shape()可以得到xy的行列,[0]取行,[1]取列
        #选取需要的特征
        feature = ["Pclass", "Sex", "SibSp", "Parch", "Fare"]
        
        # xy[feature]的类型是DataFrame,先进行独热表示,然后转成array,最后转成tensor用于进行矩阵计算。
        self.x_data = torch.from_numpy(np.array(pd.get_dummies(xy[feature]))) # pd.get_dummies(): 将原本不好区分的数据进行再次打标签区分,从而得到更细的数据。
        self.y_data = torch.from_numpy(np.array(xy["Survived"]))
        
        print('xy[feature]=',xy[feature])
        print('pd.get_dummies()=',pd.get_dummies(xy[feature]))
        print('arry=',np.array(pd.get_dummies(xy[feature])))
        print('x_data=',self.x_data)
        
    
    def __getitem__(self,index):  # 魔法函数,支持 dataset[index]
        return self.x_data[index],self.y_data[index]
    
    def __len__(self): # 魔法函数, 支持 len()
        return self.len
 
# 实例化自定义类,并传入数据地址
dataset = TitanicDataset('titanic.csv')
 
# num_workers是否要进行多线程服务,num_worker=2 就是2个进程并行运行
# 采用 Mini-Batch 的训练方法
train_loader = DataLoader(dataset = dataset,
                         batch_size = 32,
                         shuffle = True,
                        num_workers = 2)  # 双线程

'''

design model

'''
class Model(torch.nn.Module):  # 设置要从torch神经网络模块中要继承的模型函数
    
    def __init__(self):
        super(Model,self).__init__()  # 对继承于torch.nn的父模块类进行初始化
        self.linear1 = torch.nn.Linear(5,3)  # 输入5 输出3;五个特征转化为了6维,因为get_dummies将性别这一个特征用两个维度来表示,即男性[1,0],女性[0,1]
        self.linear2 = torch.nn.Linear(3,1)
        self.sigmoid = torch.nn.Sigmoid()  # 调用nn下的模块,作为运算模块
        
    # 正向传播    
    def forward(self,x): 
        x= self.sigmoid(self.linear1(x))
        print('-----x1=',x)
        x= self.sigmoid(self.linear2(x))
        print('-----x2=',x)
        return x
 
    # 预测函数, 用在测试集
    def predict(self,x):
         with torch.no_grad(): #上下文管理器,被该语句 wrap 起来的部分将不会 track 梯度。
            x=self.sigmoid(self.linear1(x))
            x=self.sigmoid(self.linear2(x))
            y=[]
            # 根据二分法原理,划分y的值
            for i in x:
                if i >0.5:
                    y.append(1)
                else:
                    y.append(0)
            return y
 
model = Model()

'''

criterion & optimizer 

'''
criterion = torch.nn.BCELoss()
optimizer = torch.optim.SGD(model.parameters(),lr=0.01)

'''

training cycle + testing

'''
# 防止windows系统报错
if __name__ == '__main__':

    loss_lst = []

    # 采用 Mini-Batch 的方法训练, 要采用多层嵌套循环
    # 所有数据都跑100遍
    for epoch in range(100):
        sum = 0
        # data从train_loader中取出数据(取出的是一个元组数据):(x,y)
        # enumerate可以获得当前是第几次迭代,内部迭代每一次跑一个Mini-Batch
        for i, data in enumerate(train_loader, 0):
            # 准备数据 inputs 获取到 data 中的 x 的值,labels 获取到 data 中的 y 值
            inputs, labels = data
            inputs = inputs.float()
            labels = labels.float()
            # 正向传播
            y_pred = model(inputs)
            y_pred = y_pred.squeeze(-1) # 前向输出结果是[[12],[34],[35],[23],[11]]这种,需要将这个二维矩阵转换成一行[12,34,35,23,11]
            loss = criterion(y_pred, labels)
            print('epoch, i, loss.item()=',epoch, i, loss.item())
            sum += loss.item()
            # 反向传播
            optimizer.zero_grad()
            loss.backward()
            # 更新
            optimizer.step()

        loss_lst.append(sum / train_loader.batch_size)

    # 可视化
    num_lst = [i for i in range(len(loss_lst))]
    plt.plot(num_lst, loss_lst)
    plt.xlabel('epoch')
    plt.ylabel('loss')
    plt.show()

    # 测试集数据准备
    test_data = pd.read_csv('titanic.csv') #读取数据
    feature = ["Pclass", "Sex", "SibSp", "Parch", "Fare"] # 和训练集保持特征的一致性 选取相同的项

    test = torch.from_numpy(np.array(pd.get_dummies(test_data[feature]))) # 与训练集保持一致
    # 进行预测,并将结果以CSV格式保存
    y = model.predict(test.float()) # 浮点数
    outputs = pd.DataFrame({'PassengerId': test_data.PassengerId, 'Survived': y})
    outputs.to_csv('predict_titantic', index=False)  # index=False 代表不保存索

    # 观察一下结果
    outputs.head()

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【hw1】b站刘二大人,第八讲课后题Titanic 的相关文章

随机推荐

  • PMS-adb install安装应用流程(Android L)

    第一次画流程图画的不好 通过adb install安装应用时对framework来说会首先调用Pm java的runInstall 方法 private int runInstall int installFlags 0 int userI
  • mesa调试技巧

    技术关键字 mesa log系统 环境变量 目录 前言 一 gdb或vscode的断点调试 二 mesa log 系统的使用 总结 前言 软件调试技术是要求软件开发人员必备的一项技能 不同的问题具有不同的调试手段和方法 本文从mesa库的实
  • xcode报错:Cycle inside *******

    xcode报错 Cycle inside building could produce unreliable results This usually can be resolved by moving the target s Heade
  • 基于pytorch实现的Auto-encoder模型

    最近因为在自己论文当中可能要用到Auto encoder 这个东西 学了点皮毛之后想着先按照别人的解释实现一下 然后在MNIST数据集上跑了下测试看看效果 话不多说直接贴代码 Author Media 2020 10 23 import t
  • ci/cd 流程图_如何在整个CI / CD工作流程中衡量软件的可靠性

    ci cd 流程图 克服具有持续可靠性的CI CD工作流程中保持代码质量的挑战 CI CD的做法鼓励在开发中频繁进行代码集成 加快新版本的准备工作并自动化部署 借助这种新工具 软件开发生命周期的这些部分都得到了改善和加速 同时 我们用于评估
  • Spring MVC(Boot) Servlet 3.0异步处理,DeferredResult和Callable(续篇)

    目录 背景 意外发现 结论 背景 上篇Spring MVC Boot Servlet 3 0异步处理 DeferredResult和Callable 我把WebMvcConfig 代码 继承WebMvcConfigurationSuppor
  • 搜索引擎和知识图谱那些事 (上).基础篇

    这是一篇基础性文章 主要介绍搜索引擎和知识图谱的一些原理 发展经历和应用等知识 希望文章对你有所帮助 如果有错误或不足之处 还请海涵 参考资料见后 一 搜索引擎 一 搜索引擎的四个时代 根据张俊林大神的 这就是搜索引擎 这本书中描述 推荐大
  • C++ stl容器

    1 std string string constructor include
  • 有哪些通俗易懂的例子可以解释 IaaS、PaaS、SaaS 的区别?

    首先 什么 云 很多年前 我们家住一小平房 喝水就喝院子里的井水 冬天取暖自己烧煤炉 后来经济状况好了 搬进了楼房 喝水喝上了集中供应的自来水 冬季用上了集中供应的暖气 再也不用打水和掏黑煤球 这就是 云 的基本概念 过去企业数据维护需要恒
  • 声纹识别中pooling总结

    1 Statistics Pooling http danielpovey com files 2017 interspeech embeddings pdf The statistics pooling layer calculates
  • Python手册(Standard Library)--math+random

    文章目录 math random math math import math math truck x 取整 math ceil x 天花板 math floor x 地板 math exp x math log x b math e 计算
  • 机器学习与数学基础知识(一)

    最近 朋友分享给我一套 七月在线 的机器学习视频 我几经思量之后 决定从视频量最少的数学基础部分开始看起 今天学习完了第一个视频 长达2小时 感觉老师讲的挺不错的 以前自己就对机器学习很感兴趣 做了一些了解和尝试性地学习 也看了一点经典的林
  • 专升本数学——极限与连续(二)笔记

    一 无穷大量与无穷小量 1 定义 无穷小量 如果 lim f x 0 则称 f x 是此极限条件下的无穷小量 本质 以 0 为极限的函数 x 2 是 x gt 0 时的无穷小量 无穷大量 如果 lim f x 无穷 则称 f x 是此极限条
  • 详解grep(一)grep基础、语法格式、常用选项与退出状态码的案例解析

    目录 一 GREP基础 1 1 grep的全称 1 2 grep语法格式 二 grep常用选项 2 1 长短选项的说明 2 2 显示常用信息 2 3 控制匹配模式的选项 2 4 控制输出内容的选项 2 5 控制输出行前缀的选项 2 6 控制
  • java学习笔记——JDBC 中 ResultSet、ResultSetMetaData配置对象的属性、批处理

    使用ResultSet ResultSetMetaData操作数据表 SELECT public void test1 1 获取连接 Connection conn null PreparedStatement ps null 4 执行 S
  • SpeechSynthesisUtterance 语音合成使用 文字语音播报

    一 关于HTML5语音Web Speech API HTML5中和Web Speech相关的API实际上有两类 一类是 语音识别 Speech Recognition 另外一个就是 语音合成 Speech Synthesis 这两个名词听上
  • ESP32(MicroPython) 编码器电机闭环控制

    本人最近查找资料时 发现ESP32上的使用MicroPython的编码器电机相关程序较少 闭环控制程序都是Pyboard上的 与ESP32不完全兼容 本人通过micropython编程 esp32 drv8833 霍尔编码器 micropy
  • 八大排序汇总

    目录 1 插入排序 2 希尔排序 3 选择排序 4 堆排序 5 冒泡排序 6 快速排序 总体思想 1 左右指针法 2 挖坑法 3 前后指针法 4 时间复杂度与三数取中 5 小区间优化 6 针对所有数据重复的优化 7 非递归实现快排 8 稳定
  • 《我在大学挺好的》之——选择了计算机专业

    大家好 我是小鱼儿 Hello 各位铁汁们 今天咱不聊技术 谈我是为什么选择计算机专业 同时聊聊我的最近一年的经历 以及我为啥要写博客 大家完全可以把这篇文章看作是一次闲谈 哈哈 目录 我为啥要选择计算机专业 我最近半年经历了什么 我的大学
  • 【hw1】b站刘二大人,第八讲课后题Titanic

    pre 代码没啥新意 很多人都分享过了 主要想记录一下自己遇到的bug以及收获 bug 1 RuntimeError mat1 and mat2 shapes cannot be multiplied 32x5 and 6x3 nn lin