Eye_Blinking_PYTORCH

import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
from torchvision import datasets, transforms
from torch.autograd import Variable
from torch.utils.data import Dataset
import os
import glob
import matplotlib.pyplot as plt
import numpy as np

imgs_open = glob.glob('datasets/openRightEyes/*.jpg')
imgs_closed = glob.glob('datasets/closedRightEyes/*.jpg')

batch_size = 50
iterations = 20

class Train_Dataset(Dataset):
    def __init__(self):
        self.images = []
        self.labels = []

        for i in range(0, 1000):
            image = plt.imread(imgs_open[i])
            image = np.reshape(image, [1, 24, 24])
            self.images.append(image)
            self.labels.append(0)

        for i in range(0, 1000):
            image = plt.imread(imgs_closed[i])
            image = np.reshape(image, [1, 24, 24])
            self.images.append(image)
            self.labels.append(1)

        self.images = np.array(self.images, dtype=np.float32)
        self.labels = np.array(self.labels, dtype=np.int64)

        self.images = torch.from_numpy(self.images)
        self.labels = torch.from_numpy(self.labels)

    def __getitem__(self, index):
        return self.images[index], self.labels[index]

    def __len__(self):
        return 2000


class Test_Dataset(Dataset):
    def __init__(self):
        self.images = []
        self.labels = []

        for i in range(1000, len(imgs_open)):
            image = plt.imread(imgs_open[i])
            image = np.reshape(image, [1, 24, 24])
            self.images.append(image)
            self.labels.append(0)

        for i in range(1000, len(imgs_closed)):
            image = plt.imread(imgs_closed[i])
            image = np.reshape(image, [1, 24, 24])
            self.images.append(image)
            self.labels.append(1)

        self.images = np.array(self.images, dtype=np.float32)
        self.labels = np.array(self.labels, dtype=np.int64)

        self.images = torch.from_numpy(self.images)
        self.labels = torch.from_numpy(self.labels)
    def __getitem__(self, index):
        return self.images[index], self.labels[index]

    def __len__(self):
        return 423

train_dataset = Train_Dataset()
test_dataset = Test_Dataset()

train_loader = torch.utils.data.DataLoader(dataset=train_dataset,
                                           batch_size=batch_size,
                                           shuffle=True)

test_loader = torch.utils.data.DataLoader(dataset=test_dataset,
                                          batch_size=batch_size,
                                          shuffle=False)







class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        # 输入1通道,输出32通道,kernel 3*3
        self.conv1 = nn.Conv2d(1, 32, kernel_size=3, padding=1)
        self.conv2 = nn.Conv2d(32, 50, kernel_size=3, padding=1)
        self.mp = nn.MaxPool2d(2)
        # fully connect
        self.fc1 = nn.Linear(1800, 1024)
        self.fc2 = nn.Linear(1024, 2)

    def forward(self, x):

        x = F.relu(self.conv1(x))
        x = self.mp(x)
        x = F.relu(self.conv2(x))
        x = self.mp(x)
        b_n = x.size(0)
        x = x.view(b_n, -1)
        x = F.relu(self.fc1(x))
        x = self.fc2(x)
        return F.log_softmax(x)


net = Net()
optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)


for i in range(iterations):

    #Train
    for batch_idx, (data, target) in enumerate(train_loader):
        data, target = Variable(data), Variable(target)
        optimizer.zero_grad()
        output = net(data)
        loss = F.nll_loss(output, target)
        loss.backward()
        optimizer.step()

        pred = output.data.max(1, keepdim=True)[1]
        accuracy_ = pred.eq(target.data.view_as(pred)).float()
        accuracy = accuracy_.mean()

        if batch_idx % 5 == 0:
            print('Train Epoch: %d  [%d/%d ]  %f \tTrainLoss: %f\tTrainAcc:%f'%(
                i, batch_idx * len(data), len(train_loader.dataset),
                       1.0 * batch_idx / len(train_loader), loss.data, accuracy))

    # Test
    accuracy_all = 0
    for batch_idx, (data, target) in enumerate(test_loader):
        data, target = Variable(data), Variable(target)
        output = net(data)
        pred = output.data.max(1, keepdim=True)[1]
        accuracy_ = pred.eq(target.data.view_as(pred))
        accuracy = accuracy_.sum()
        accuracy_all += accuracy
    x1 = len(test_loader.dataset)
    accuracy_mean = accuracy_all.float()/len(test_loader.dataset)

    print('Train Epoch: %d\tTestAcc: %f'%(
                i,  accuracy_mean))







数据集已经上传到了我的CSDN的资料库里

 

单链表的基本操作 1.实验题目 问题描述:实现带头结点的单链表的建立、求长度,取元素、修改元素、插入、删除 等单链表的基本操作。通过代码的编写理解并掌握单链表的过程编写以及作用。 2.实验要求 (1)依次从键盘读入数据,建立一个单链表并将单链表的初始化设置为空; (2)通过操作选择,输出单链表中的数据元素 (3)显示单链表的长度; (4)根据指定条件能够查找出元素和修改元素; (5)实现在指定位置插入和删除元素的功能 (6)显示操作后的结果 3.算法设计 (1)用到的结构(逻辑结构、存储结构) 逻辑结构:线性结构 存储结构:带头结点的单链表 (2)算法设计思路 定义结点类型LNode,每个结点包括数据域data和指针域next。定义头指针LinkList 。编写如下函数: 1、createlist(LinkList &L);用尾插法创建一个带头结点的单链表。 2、print(LinkList L);输出该单链表中的数据元素。 3、ListLength(LinkList L);求该单链表的长度。 4、GetElem(LinkList &L,int i,ElemType &e);查找第i个元素。 5、SetElem(LinkList &L,int i,ElemType m);修改第i个元素。 6、ListInsert (LinkList &L, int i, ElemType e );在第i个元素前插入一个元素。7、ListDelete(LinkList &L,int i,ElemType &e2);删除第i个元素。 8、main();通过case结构来调用createlist(LinkList &L)、GetElem(LinkList &L,int i,ElemType &e)、SetElem(LinkList &L,int i,ElemType m)、ListInsert (LinkList &L, int i, ElemType e )、ListDelete(LinkList &L,int i,ElemType &e2) 4.调试和测试 调试过程总结经过多次调试,本程序能很好的完成实验要求的各项功能。给出几组测 试数据及实验结果: 4.1 系统界面 4.2 创建带头结点的单链表 (先输入单链表整数,每输入完一个整数后按回车键,数据输入完后以0结束) 4.3 打印链表中的数据 4.4 打印链表长度 4.5 按位置取元素 4.6 修改链表中的元素 4.7 插入结点 4.8 按结点位置编号删除结点 4.8 显示做了修改后的链表元素: 5.实验总结 对比这次试验,在上机的时候明显感觉到比之前更加有思路,能够很好地找个关键性 的语句对程序进行修改,这次试验虽然说比上次好,但是也暴漏出了许多的缺陷,在编 写的时候,感觉整个流程都挺对,但是就是运行不出来,或者是不能够实现原有的功能 ,通过与同学的交流,然后慢慢地参照课本才将本次试验很好地完成。 6.附录(源程序) #include<stdio.h> #include<conio.h> #include"stdafx.h" #define OK 1 #define ERROR 0 typedef char ElemType; typedef int Status; typedef struct LNode { ElemType data; LNode *next; } LNode,*LinkList; Status createlist(LinkList &L) //尾插法创建带头结点的单链表 { int ch; L=new LNode; L->next=NULL; printf("请输入单链表中的数据:"); scanf("%d", &ch); LinkList r=L; while(ch!=0) { LinkList p=new LNode; p->data=ch; p->next=NULL; r->next=p; r=p; scanf("%d", &ch); } return OK; } void print(LinkList L) //输出单链表 { LinkList p=L->next; printf("单链表为:\n"); while(p) { printf("%2d",p->data); p=p->next; }} Status ListLength(LinkList L) //求单链表的长度 { int k=0; LinkList p=L->next; while(p){ k++; p=p->next;} printf("\n"); printf("单链表的长度为 %d:" , k); printf("\n"); return k; } Status GetElem(Lin 单链表是一种常见的数据结构,它由一系列节点组成,每个节点包含数据元素和指向下一个节点的指针。在这个实验报告中,重点是实现带头结点的单链表的基本操作,包括建立、求长度、取元素、修改元素、插入和删除等。 实验题目要求从键盘读入数据来构建一个单链表,并初始化为空。这意味着我们需要编写一个函数来创建链表,例如`createlist`函数,该函数使用尾插法,即每次新输入的数据会被添加到链表的末尾。这可以通过循环读取用户输入,创建新的节点并将其连接到现有链表的末尾来实现。 实验要求能够输出链表中的数据元素,这可以通过`print`函数完成。此函数遍历链表,打印每个节点的数据域。 另外,链表的长度可以通过`ListLength`函数计算,该函数遍历整个链表,每次遇到一个节点就增加计数器,最后返回计数值。 查找和修改元素的功能由`GetElem`和`SetElem`函数提供。`GetElem`用于获取指定位置的元素,而`SetElem`则用于修改这个位置的元素值。这两个函数都需要处理非法索引的情况,例如索引超出链表范围。 此外,实验还需要实现插入和删除操作。`ListInsert`函数在给定位置插入新元素,而`ListDelete`函数删除指定位置的元素。这两种操作都需要在链表中找到正确的位置,然后调整指针以保持链表的连续性。 在实验的调试和测试阶段,作者通过输入不同数据和执行各种操作来验证程序的正确性,并针对出现问题的地方进行了修改和完善。 实验总结部分,作者提到这次实验相比以前更有思路,能够更有效地修改程序,但也暴露了编程过程中的一些不足,如逻辑错误或功能不完全实现。这些问题通过与同学的交流和参考教材得到了解决。 源代码部分展示了实现这些功能的C语言结构,包括定义链表节点类型`LNode`,头指针`LinkList`,以及上述各函数的定义。这些函数实现了链表操作的核心逻辑。 这个实验旨在加深对单链表的理解,包括其基本操作的实现细节和问题解决过程,这对于学习数据结构和算法至关重要。通过这样的实践,可以提高对链表这种数据结构的实际运用能力。。内容来源于网络分享,如有侵权请联系我删除。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值