精华内容
下载资源
问答
  • ANN MNIST手写数字识别总结
    千次阅读
    2020-12-04 05:59:55

    由于第十四周除了正常上课外,

    其余时间在整理机器学习的笔记,

    做中特社会调查报告,

    然后就是元旦放假,故第十四周没提交周报。

    本周正常上课,

    继续完成老师都布置的课业任务,

    总结通信系统仿真结果,

    并且完成报

    告的撰写,分析社会调查结果,做好报告,查阅物理层安全方面的资料,翻译和整理论文。

    其余时间是开始学习深度学习理论和编程实践,人工神经网络

    (ANN)

    和卷积神经网络,了解

    深度学习几个框架

    (Caffe

    Torch

    TensorFlow

    MxNet)

    ,最主要还是

    TensorFlow

    ,学习和查

    找了一下深度学习优化算法,并且利用人工神经网络做手写数字识别。

    心得体会:第一个感受是时间过得很快,已然是

    15

    周了,要加快各方面进程。神经网

    络从线性分类器开始,

    线性分类器是产生一个超平面将两类物体分开。

    一层神经网络叫做感

    知器,

    线性映射加激励输出,

    每个神经元对输入信号利用激励函数选择输出,

    就像大脑神经

    元的兴奋或抑制,增加神经元数量、

    隐层数量,就可以无限逼近位置函数分布的形态,

    过多

    会出现过拟合算法。

    ANN

    的学习方法是

    BP

    后向传播算法,其主要思想是每一层的带来的预

    测误差是由前一层造成的,

    通过链式求导法则将误差对每一层的权重和偏置进行求导更新权

    重和偏置,以达到最优结果。因为

    ANN

    每一层神经元是全连接的,对于图像这种数据就需

    要非常大数量的参数,所以就出现了卷积神经网路

    CNN

    ,利用一些神经元以各种模版在图

    像上滑动做卷积形成几张特征图,

    每个神经元的滑动窗口值不一样代表其关注点不一样,

    个神经元对整张图的窗口权重是一样的即权值共享

    (这就是减少参数和神经元数量的原因)

    这么做的依据是像素局部关联性。

    CNN

    主要有数据数据输入层、卷积计算层、激励层、池

    化层(下采样层)

    、全连接层、

    Batch Normalization

    层(可能有)

    CNN

    学习方法也是

    BP

    算法

    迭代更新权重

    w

    和偏置

    b

    CNN

    优点是共享卷积核,对高维数据处理无压力,无需手动选

    取特征,训练好权重,即得特征,深层次的网络抽取,信息丰富,表达效果好,缺点是需要

    调参,

    需要大样本量,

    训练最好要

    GPU

    物理含义不明确。

    主要采用随机失活的方法解决过

    拟合问题,因为

    CNN

    网络学习能力强,如果样本量小,容易让网络将样本的所有细节记忆

    下来而不是学习到样本的共性规律,

    所以随机失活神经元让部分神经元工作就可以缓解过拟

    合问题。个人觉得深度学习理论不是很难,就是对硬件的要求很高,

    GPU

    真是其必备工具。

    深度学习学习最主要的学习框架觉得是

    TensorFlow

    ,因为

    Google

    大力支持,社区很庞大,

    就是依赖硬件能力强。

    以下是

    ANN

    MNIST

    手写数字识别程序和结果,数据集是经典的

    Yann

    LeCun

    (人工智能

    界大佬)

    MNIST

    数据集,每张照片大小是

    28

    *

    28

    的灰度图,训练集

    5000

    张图片,验证集

    1000

    张图片,测试集

    10000

    张:

    更多相关内容
  • javascript课程内容总结

    2017-09-25 14:26:33
    在课堂上学到的JavaScript进行总结,希望可以帮助更多的人,多多分享自己,从而能互相学习,如果的有错误的地方也希望大家能指正
  • 学生上课签到系统开发总结

    万次阅读 2017-05-27 18:58:52
    由于期末作业要交个作品,正好这学期学了ssh企业及应用开发,所以就...这篇博客就简单的对项目做个总结。 首先从三大框架(ssh)整合说起,我用的IDE是myeclipse2015,据说是自带整合三大框架的功能,但是我没去用,我

    由于期末作业要交个作品,正好这学期学了ssh企业及应用开发,所以就用ssh做了个最简单的签到系统,从最基本的整合开始,经历了各种坑,直到项目完成,花了一周的时间。基本上每天都在敲代码,一个人一周完成一个项目,肯定有很多瑕疵,但是交交课程设计足以。这篇博客就简单的对项目做个总结。

    首先从三大框架(ssh)整合说起,我用的IDE是myeclipse2015,据说是自带整合三大框架的功能,但是我没去用,我是用maven整合构建三大框架,这里推荐大家使用maven,相当好用的东西,一个配置文件就把jar包都加进来了,很清晰。具体的maven怎么用,这篇博客就不细说,请自行百度。

    整合完毕之后,就是建包分层了,这里就贴一张我分层的截图,这是我的分层,你们可以参考。
    这里写图片描述
    最基本的五层:dao、entity、service、service.impl、action(web)
    附加的三层:utils(存工具类)、enums(存枚举类)、dto(封装数据类,用于各层之间数据传递)

    分层完毕后,我们的项目还没有代码,也不要急着写代码,先去建好数据库,当然你们也可以使用正向工程通过hibernate的xml配置文件生成数据库表,但是我的开发的习惯是先建数据库表,再写实体类。

    数据库建好后,终于要到写代码的时候了,首先是写实体类entity层,由于要快速开发,所以就不手写实体类了,使用hibernate逆向工程生成实体类。逆向工程就是个坑,百度了一晚上也找不到适用myeclipse2015的hibernate逆向工程,最后在自己对次尝试下,终于成功的生成了实体类和dao层,具体的使用方法可以参考我的另一篇博客 myeclipse2015(shh整合)hibernate逆向工程生成代码(mysql),这里就不细说了。

    不管是ssh还是ssm框架,最大的坑都是配置文件,但是好在这东西很死板,配一次能用上N次,配置文件问题我会将整个项目挂到github上,供大家参考。

    搞完这些后,我们算是能开始开发了,开发过程这里说一下我开发一个功能的思路是:首先我先去想一个功能应该在网页上怎么用,要传哪些参数,然后我action、service层应该怎么写,想完这些后我就开始写功能,写的时候,应该从下往上写,先写dao,再写service,写action,最后写页面。当然如果你有十足的把握能,写出来没啥问题,那就一气呵成直接写完,但是如果你觉得可能会出问题就得对每一层做单元测试了,单元测试我使用JUnit,我的项目里有测试的代码可以参考。

    写前端页面的话,如果你前端页面写的不怎么样可以和我一样使用第三方的插件,比如我就是用layui写前端页面,简单又方便。

    项目发开的时候最好备份一下自己的项目,不然天知道会有多倒霉代码被删了,代码被删了也不是真的要重写了,如果你有部署到tomcat(或者用myeclipse运行过)就能把部署文件打个包使用jd-gui反编译回来,虽然改回原样要花点时间,但是总比屁都没了好啊!(不要问我为什么那么清楚,我会告诉你我把代码删掉了吗?哼、天真)
    再放上几篇我的博客,记录的是我在开发中遇到的坑,你们可以参考一下。

    Struts2权限控制

    对于hibernate懒加载模式报错处理

    Struts2使用原生的HttpServletRequest和HttpServletResponse

    最后我的项目已经挂到github上了,放上地址,如果有需要可以参考一下。
    学生上课签到系统

    展开全文
  • 本人在考江南大学控制科学工程专业学习及在读期间帮同学上课或通过屏幕录像专家录制视频讲解自己手写扫描的807自动控制原理真题解析答案等资料;适用于报考江南大学控制科学与工程专业或控制工程专业。(由于文件太...
  • C++ PTA习题总结 PTA C++ 期末复习资料 之前上课写过的一些客观题和编程题 进行了整理 编程题是文本格式的
  • java课程总结报告

    2021-02-28 09:19:56
    java课程总结报告java课程总结报告怎么?相信很多人都想知道吧?以下是小编为您整理java课程总结报告的相关资料,欢迎阅读!java课程总结报告1一开始想做计算器那个课题,原因很简单,就是因为我感觉那个课题很...

    java课程总结报告

    java课程总结报告怎么写?相信很多人都想知道吧?以下是小编为您整理java课程总结报告的相关资料,欢迎阅读!

    1ed4bbb8daa59cf00c24d4b8a019b71c.png

    java课程总结报告1

    一开始想做计算器那个课题,原因很简单,就是因为我感觉那个课题很简单,在百度里一搜就搜到了一模一样的源程序。只是感觉没什么意思,那个界面也不是很好看,又不好玩。所以就做了现在这个猜数游戏。一直想编个游戏程序,于是就到网上去搜代码,一下子就搜到了,而且代码很少,简单易懂。程序是弄好了,那么简短的程序写起报告就犯难了!不得不把程序再添加些模块,充实充实。

    这也让我感觉实训远比想像的难度大,不是网上随便搜一下就可以交差的!不仅需要自己看懂代码,还需要根据自己的需要添加模块,充实代码。

    从网上搜的代码都是字符界面的,老师说既然字符界面的没挑战性,那就做图形界面的好了。做图形界面就有点犯难了,首先没有什么程序可以参照了,必须自己充分理解字符界面的源代码,然后逐步修改完善。

    我依据课本上的GUI章节设计了此次的java简单程序,基本实现了课题的要求,还添加了图片以增加视觉效果,以及确定按钮方便用户确定输入数字。

    通过这次实训我的体会归纳为以下4点:

    1.态度第一摆正自己的心态,不要以为什么东西上网搜搜就可以了,一定要有自己的东西。只有自己付出过,当程序运行成功时的那种喜悦才会令自己有一种莫名的自豪感。态度决定一切!

    2.兴趣是关键我的学习完全是兴趣导向的,所以压力并不大。因为有兴趣,所以我会很想充分理解一切细节。又因为理解,所以许多原本片片断断的知识都可以渐渐互相融会贯通,累积技术能量,理论和实务之间的藩篱被打破了,学习效率倍增。学习并快乐着!

    3.敢于挑战不安于现成的程序,要敢于用多种方法实现一个目的。现在的网络科技很发达,想要一个源程序的确很简单,所以很多人都是在自己都不明白题目要求时,就可以在网上搜到一模一样的代码,根本没有自己的东西。挑战自我是项艰巨的任务。只有坚持自己多看代码多写程序才会有更多的收获。

    4.不懈追求要对源代码进行不断地完善,要尽可能地实现课题所要求的功能。对初学者来说,大量地写程序是必要的,但过了某个阶段之后,写程序所带来的技术能力成长已经到了极限,还不如多花一点时间看书,学新技术和新观念。可以从实现源程序功能着手,比如添加写模块啊什么的,实现更多功能。看着自己编的程序能成功运行,这样自己会更感兴趣,也就会乐此不疲。

    java课程总结报告2

    在本学期的二周时间内,我们在学校机房进行了为期二周的JAVA实训。现在即将结束了,回首本学期的java学习,重点还是在学习概念等一些常识性的东西,也学到平常在课堂中没有学到的东西,在JAVAAPI中又多认识了几种类,使我对JAVA产生了浓厚的兴趣。两周的时间说长也不长,在这两周中,我们的实训任务是仓库管理系统,在演示过程中,并没有觉得它有很难,但在实际编程过程中,却遇到了各种各样的错误,这也多亏了老师的指点和班级同学的帮忙,使我一步步克服了实训过程中遇到的困难。虽然我所做的系统并没有实现所有功能,但是我觉得自己进步了,很多原来都不懂的东西现在都已经了解了,也培养了我的团队合作精神,让我感受到了集体的温暖。实训的过程与课堂上的讲课比,更为有趣,因为可以真正的自己动手操作,使我对老师上课所讲的内容有了更深一步的了解,使我在以后的编程中可以灵活运用。我期待以后有更多类似的实训,使我们可以多掌握一项技能,也可以让我们在以后找工作中可以有更多的'实践经验。学知识可不能凭自己的爱好和一时兴趣,要一步一个脚印,认认真真,踏踏实实,理论与实践相结合,在扎实掌握课本实例和内容之后,有一定的扩展阅读和课外学习,充分全面的了解JAVA的应用和扩展运用。

    在我所学的语言当中,我自认为JAVA是一门比较强大的面向对象的编程语言,不仅仅因为它的跨平台性,更多的是因为它的灵活多变和实用性较强,可以说比较的经典和强悍。所以学好java语言有很大的用处,这次实训,我们更多学到的是不懂就问和自己应该尽自己的全力去尝试,哪怕失败,只要自己尽自己的全力,和身边同学一起探讨而不是抄袭,团结合作,发挥团队意识,最后在自己的努力下,终于运行成功,这种成就感美不可言,心情愉悦至极。

    最后终于要结束了,大家都有种释怀的感觉,当然我想我更多的是兴奋和自己掌握了知识之后的饱满感,学知识就像吃东西一样,吃饱了就应该好好的消化。要不断的温习和运用,做到举一反三,将所学知识充分融入到平时的学习生活中去,为以后的工作做好坚实的基础。感谢学校和老师能够为我们提供这次机会,让我们更好的掌握和了解JAVA这门语言。

    【java课程总结报告】相关文章:

    展开全文
  • 今天刷到了一个这样的短视频,我寻思我是不是也可以一个类似的上课点名程序,想法经不起等待,说~ 一.准备工作 1.Tkinter Tkinter 是 python 内置的 TK GUI 工具集。TK 是 Tcl 语言的原生 GUI 库。作为...

    今天刷到了一个这样的短视频,我寻思我是不是也可以写一个类似的上课点名程序,想法经不起等待,说写就写~

    一.准备工作

    1.Tkinter

    Tkinter 是 python 内置的 TK GUI 工具集。TK 是 Tcl 语言的原生 GUI 库。作为 python 的图形设计工具,它所使用的 Tcl 语言环境已经完全嵌入到了 python 解释器中。

    我们使用Tkinter开发GUI界面。

    2.PIL

    PIL(Python Image Library)库是Python语言的第三方库,需要通过pip工具安装。安装PIL库的方法如下,需要注意,安装库的名字是pillow。

    PIL库支持图像储存、显示和处理,他能够处理几乎所有图片格式,可以完成对图像的缩放、剪裁、叠加以及向图像添加线条、图像和文字等操作。

    使用PIL中的Image,ImageTk处理、引入一张图片,可以使用下面代码安装一下。

    pip install pillow

    二.预览

    1.启动

    图片

    双击打开后,进入软件主界面,所有功能一目了然。程序会自动识别软件目录下的names.txt,将里面的名字导入。

    2.开始点名-顺序点名

    图片

    选择顺序点名后,点击开始,屏幕上就开始滚动出现人名,人名出现的概率是相同的,点击停止,人名就停止滚动,点名结束。

    3.开始点名-随机点名

    图片

    点击随机点名,程序就会进行随机点名,人名出现的概率是随机的。

    4.手动加载人名单

    图片

    可以自己手动选择人名单,前提是人名单格式为txt,且每个名字占一行。

    5.开始点名-顺序点名-Pyqt5版本

    图片

    用Pyqt5也写了一个版本,实现逻辑与TK版本相同,界面可能更好看了一些,但是文件大了许多,大家可以在后面总结部分自取。

    三.思路

    1.整体实现思路

    图片

    2.点名实现思路

    图片

    四.源代码

    point_names-GUI.py(主程序GUI)

    import random
    import re
    import time
    import threading
    from tkinter import *
    from tkinter import ttk
    from base64 import b64decode
    from PIL import Image,ImageTk
    from tkinter import messagebox
    from tkinter.filedialog import askopenfilename
    
    
    """"
    2021-11-10点名/抽奖程序
    主要亮点:
    1.两种模式:
    ①顺序点名
    ②随机点名
    2.自动识别人名单
    3.支持手动导入人名单
    4.人名单导入校验
    5.人名显示位置自动矫正
    6.最多显示五个大字
    """
    
    imgs=['./point_name.png']
    class APP:
        def __init__(self):
            self.root = Tk()
            self.running_flag=False #开始标志
            self.time_span=0.05 #名字显示间隔
            self.root.title('Point_name-V1.0')
            width = 680
            height = 350
            left = (self.root.winfo_screenwidth() - width) / 2
            top = (self.root.winfo_screenheight() - height) / 2
            self.root.geometry("%dx%d+%d+%d" % (width, height, left, top))
            self.root.resizable(0,0)
            self.create_widget()
            self.set_widget()
            self.place_widget()
            self.root.mainloop()
    
        def create_widget(self):
            self.label_show_name_var=StringVar()
            self.label_show_name=ttk.Label(self.root,textvariable=self.label_show_name_var,font=('Arial', 100,"bold"),foreground = '#1E90FF')
            self.btn_start=ttk.Button(self.root,text="开始",)
            self.btn_load_names=ttk.Button(self.root,text="手动加载人名单",)
            self.lf1=ttk.LabelFrame(self.root,text="点名方式")
            self.radioBtn_var=IntVar()
            self.radioBtn_var.set(1)
            self.radioBtn_sequence=ttk.Radiobutton(self.lf1,text="顺序点名",variable=self.radioBtn_var, value=1)
            self.radioBtn_random=ttk.Radiobutton(self.lf1,text="随机点名",variable=self.radioBtn_var, value=2)
            self.label_show_name_num=ttk.Label(self.root,font=('Arial', 20),foreground = '#FF7F50')
            paned = PanedWindow(self.root)
            self.img = imgs
            img_=b'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'
            the_img = b64decode(img_)#将图片硬编码到GUI
            paned.image = ImageTk.PhotoImage(data=the_img)
            self._img = Label(self.root, image=paned.image,background='black')
    
        def set_widget(self):
            default_name_="会是谁?"
            self.label_show_name_var.set(default_name_)
            self.label_show_name_adjust(default_name_)
            self.btn_start.config(command=lambda :self.thread_it(self.start_point_name))
            self.btn_load_names.config(command=self.load_names)
            init_names=self.load_names_txt("./names.txt")
            self.root.protocol('WM_DELETE_WINDOW',self.quit_window)
            self.root.bind('<Escape>',self.quit_window)
            if init_names:
                self.default_names=init_names   #1.文件存在但是无内容。2.文件不存在
                self.label_show_name_num.config(text=f"一共加载了{len(self.default_names)}个姓名")
            else:
                self.btn_start.config(state=DISABLED)
                self.label_show_name_num.config(text=f"请先手动导入人名单!")
    
        def place_widget(self):
            self.lf1.place(x=300,y=160,width=250,height=50)
            self.radioBtn_sequence.place(x=20,y=0)
            self.radioBtn_random.place(x=150,y=0)
            self.btn_start.place(x=300,y=220,width=100,height=30)
            self.btn_load_names.place(x=450,y=220,width=100,height=30)
            self._img.place(x=90, y=165, height=120, width=180)
            self.label_show_name_num.place(x=300,y=260)
    
        def label_show_name_adjust(self,the_name):
            if len (the_name)==1:
                self.label_show_name.place(x=280, y=10)
            elif len(the_name) == 2:
                self.label_show_name.place(x=180, y=10)
            elif len(the_name) == 3:
                self.label_show_name.place(x=120, y=10)
            elif len(the_name) == 4:
                self.label_show_name.place(x=80, y=10)
            else:
                self.label_show_name.place(x=0, y=10)
    
        def start_point_name(self):
            """
            启动之前进行判断,获取点名模式
            :return:
            """
            if len(self.default_names)==1:
                messagebox.showinfo("提示",'人名单就一个人,不用选了!')
                self.label_show_name_var.set(self.default_names[0])
                self.label_show_name_adjust(self.default_names[0])
                return
            if self.btn_start["text"]=="开始":
                self.btn_load_names.config(state=DISABLED)
                self.running_flag=True
                if isinstance(self.default_names,list):
                    self.btn_start.config(text="就你了")
                    if self.radioBtn_var.get()==1:
                        mode="sequence"
                    elif self.radioBtn_var.get()==2:
                        mode="random"
                    else:
                        pass
                    self.thread_it(self.point_name_begin(mode))
    
                else:
                    messagebox.showwarning("警告","请先导入人名单!")
            else:
                self.running_flag=False
                self.btn_load_names.config(state=NORMAL)
                self.btn_start.config(text="开始")
    
        def point_name_begin(self,mode):
            """
            开始点名,点名主函数
            :param mode:
            :return:
            """
            if mode == "sequence":
                if self.running_flag:
                    self.always_ergodic()
            elif mode=="random":
                while True:
                        if self.running_flag:
                            random_choice_name=random.choice(self.default_names)
                            self.label_show_name_var.set(random_choice_name)
                            self.label_show_name_adjust(random_choice_name)
                            time.sleep(self.time_span)
                        else:
                            break
    
        def always_ergodic(self):
            """
            一直遍历此列表,使用死循环会造成线程阻塞
            :return:
            """
            for i in self.default_names:
                if self.running_flag:
                    self.label_show_name_var.set(i)
                    self.label_show_name_adjust(i)
                    time.sleep(self.time_span)
                    if i==self.default_names[-1]:
                        self.always_ergodic()
                else:
                    break
        def load_names(self):
            """
            手动加载txt格式人名单
            :return:
            """
            filename = askopenfilename(
                    filetypes = [('文本文件', '.TXT'), ],
                    title = "选择一个文本文件",
                initialdir="./"
                    )
            if filename:
                names=self.load_names_txt(filename)
                if names:
                    self.default_names=names
                    no_Chinese_name_num=len([n for n in names if not self.load_name_check(n)])
                    if no_Chinese_name_num==0:
                        pass
                    else:
                        messagebox.showwarning("请注意",f'导入名单有{no_Chinese_name_num}个不是中文名字')
                    self.label_show_name_num.config(text=f"一共加载了{len(self.default_names)}个姓名")
                    default_name_ = "会是谁?"
                    self.label_show_name_var.set(default_name_)
                    self.label_show_name_adjust(default_name_)
                    self.btn_start.config(state=NORMAL)
                else:
                    messagebox.showwarning("警告","导入失败,请检查!")
    
        def load_names_txt(self,txt_file):
            """
            读取txt格式的人名单
            :param txt_file:
            :return:
            """
            try:
                with open(txt_file,'r',encoding="utf-8")as f:
                    names=[name.strip() for name in f.readlines()]
                    if len(names)==0:
                        return False
                    else:
                        return names
            except:
                return False
    
        def load_name_check(self,name):
            """
            对txt文本中的人名进行校验
            中文汉字->True
            非中文汉字->False
            :param name:
            :return:
            """
            regex = r'[\u4e00-\u9fa5]+'
            if re.match(regex,name):
                return True
            else:
                return False
    
        def thread_it(self,func,*args):
            t=threading.Thread(target=func,args=args)
            t.setDaemon(True)
            t.start()
    
        def quit_window(self,*args):
            """
            程序退出触发此函数
            :param args:
            :return:
            """
            ret=messagebox.askyesno('退出','确定要退出?')
            if ret:
                self.root.destroy()
    
    if __name__ == '__main__':
        a=APP()

    五.总结

    本次使用Tkinter开发了一款上课点名程序,此程序可以用于点名、抽奖…代码不到200行,程序简单又实用,主要有以下六个亮点:

    1.两种模式:

    • 顺序点名

    • 随机点名

    2.自动识别人名单

    3.支持手动导入人名单

    4.人名单导入校验

    5.人名显示位置自动矫正

    6.最多显示五个大字

    程序打包好了,大家自行下载即可:

    1、Tk版本下载链接:https://wwe.lanzoui.com/iOLtIwetvxe

    2、PyQt5版本:

    百度云下载链接:

    https://pan.baidu.com/s/16XbpMx2q2280EDmH9s1S4g

    提取码:8888

    展开全文
  • 网店运营开店实训总结 网店运营开店实训即将结束了大家不妨写写实训总结 吧! 以下是网店运营开店实训总结范文欢迎阅览 ! 网店运营开店实训总结 1 不知不觉一周网络营销 实训已经圆满结束回想在这周的实训生活虽然...
  • 网课总结教学提纲.doc

    2020-09-15 00:52:43
    网课总结 这周是网课开始的第4周由不熟悉到熟悉再到得心应手经历了一个小痛苦到快乐的过程下面针对网课的存在的一些问题以及我个人的一点小经验来简单的谈一谈 问题1 上课之前要做多种尝试是用电脑用课件讲课好还是...
  • java 项目个人总结 java 项目个人总结范文怎么 ?请看下面 java 项目个人总结 1 在这次项目之前因为个人状态和心态的原因从 gui 课程开 始便基本处于神游的状态 状态上体现在上课精力不能集中犯困 心 态上体现在明...
  • 大家好,我是辰哥~点击下方名片关注和星标『Python研究者』!????点击关注|设为星标|干货速递????今天刷到了一个这样的短视频,我寻思我是不是也可以一个类似的上课点名程序,想法经不起等待,说...
  • 网络研修总结崔.doc

    2020-02-27 07:34:22
    网络研修总结 在网络研修的日子里每天上课观看视频阅读文本完成作业反思发评论浏览简报已成为的每天的必修课通过研修我全面提升了自己的基本素养和业务综合能力对我以后的教学起到了一定的指引作用同时对教育教学...
  • 安卓实训总结2000字 软件开发工作时的安卓实训总结2000字要怎样呢?以下是安卓实训总结2000字范文阅读 安卓实训的总结1 不知不觉中为期三周的实训已经接近尾声 虽然时间很短不过我确实学到了一些我觉得有用的东西...
  • 第一章: 1: 1.2中讲的计算机中的数制微机原理老师上课没有讲不过 她说过我们在数电课就上过结合上学期所学的我们应该了解二进 制十进制十六进制八进制之间的转换不过估计程度不大如 果考试要考查相关的知识点的话...
  • 培训助教工作流程 开班前 1开班前一周 开课...跟学员说把具体要上课学员名单到考勤表上到上课时让他们签到在 开课一周之间加入的学员信息不断更新到考勤表上 要求助教要对现场设备很熟悉 比如教室里灯的开关在哪里哪
  • 转眼,这已是我在CSDN下的第九篇年终总结,真是岁月如梭。《缘起性空,归来不少年》。是啊,归来不再少年,我已经是而立之年了。当我下这几个字的时候,心里还沉甸甸的。曾经的我总以为,博士毕业继续回到贵州...
  • 重庆大学计算机组成原理课程相关的笔记。参考了上课老师的ppt和王道论坛的考研辅导用书。本人手写的笔记,也有错题总结
  • 第三百篇博客:给自己的总结

    千次阅读 多人点赞 2020-03-02 15:35:50
    这篇博客是这两年来的第三百篇博客,所以不打算和技术相关的东西,而是想用来回顾和总结一下这几年来的学习生活历程,回顾几个重要的时间节点。算是一篇给自己看的总结吧。
  • 如何好科研论文(心得体会2000字) 通过本课程的学习,我学习到了许多如何好科研论文的方法,接下来我将具体阐述我的收获。 一、在第一章中,主要学习了如何造就一篇优秀的学术论文。 (一)标题要起得好,具体...
  • 论文的总结与展望写作技巧

    千次阅读 2021-09-02 14:32:16
    那么论文的总结与展望怎么?下面我们就为大家介绍一下这两方面的写法。  一、论文的总结与展望怎么?  它主要分两部分,第- -部分写总结,说明你论文研究了哪些内容,有什么贡献和创新;第二部分展望,说明你...
  • python3GUI--200行代码一个上课点名程序(附源码)

    千次阅读 多人点赞 2021-11-11 10:21:17
    今天刷到了一个这样的短视频,我寻思我是不是也可以一个类似的上课点名程序,想法经不起等待,说~ 一.准备工作 1.Tkinter Tkinter 是 python 内置的 TK GUI 工具集。TK 是 Tcl 语言的原生 GUI 库。作为 ...
  • 2019年年终总结及明年的期望

    千次阅读 多人点赞 2019-12-03 19:30:11
    正常的上课,正常的学习,但是在学习上课就又回到学校的那种状态,有惰性; 每天都坚持看点视频,写写文章; 目前在考六级,是的,六级还没过。。。 下学期准备开始看论文和论文; 这一年的收获: 写作: 了...
  • 计算机系大学生为什么选择在CSDN博客?

    万次阅读 多人点赞 2022-03-07 09:10:28
    博客园对于我来说感觉太过于简约了,有种梦回上世纪论坛的感觉 CSDN的编辑器的投票、模板等功能都很不错,干净清爽 我在CSDN的一个学习笔记 半个月学习英文开源项目pandas_alive,半个月博客总结 用python实现了...
  • 近期总结与反思

    千次阅读 2020-12-06 10:28:47
    最近时间过得很快,不记得自己究竟做了什么,已经被生活甩在身后。...工作总结先来总结一下自己的工作,可以让自己清醒一下,看清楚自己走到哪里。1. 每天坚持写作,继续努力!(有个想法,一直用手机编辑,有些浪费...
  • java入门基础总结概括

    2018-12-23 01:20:19
    学习方法: 1.记笔记 2.动手代码 3.代码需要加注释 4.不懂就问 5.上课一定要互动
  • 上课说话检讨书200字(精选10篇)在某件事出现失误后,为了避免再次出现相同情况,就需要一份自我检讨书好好进行自我检讨,请注意检讨要把原因讲清楚。快来参考检讨书是怎么的吧,下面是小编整理的上课说话检讨...
  • 由于国内外疫情十分严重,故当下上课方式改为线上进行,为此我为了抽出更多的时间专心学习向公司领导提了辞职,希望以后有机会的话还可以再回去吧。在世界上的一个开源平台Canvas进行学习,时间过...
  • 准大四学生七月青软实训总结

    千次阅读 2019-07-27 17:12:44
    总结还是不行,总结一下这个月的收获吧,以后回头看看会很有用。 这个月我学到了什么关于人生的知识? 其实在学校一直在学习SSM框架,总觉得学完框架自己就到达了人生的小巅峰,感觉自己领先所有人的感觉,来实训...
  • 来到华清学习已经将近两个月的时间了,虽然由于疫情原因,上了三周的线上课,进度有点减缓,但是总的来说,自我感觉学的还行。 我大学学的专业就是计算机,之前就接触过c,c++等计算机语言。在大学期间,上课的...
  • c语言实验总结与反思

    2021-05-20 07:27:19
    c语言实验总结与反思c语言实验总结与反思怎么?以下是小编整理的相关范文,欢迎阅读。c语言实验总结与反思一这个星期,我们迎来了C语言实训——一次至为重要的实训。在这个星期里,同学们都很认真的做着那20多道实...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 26,472
精华内容 10,588
关键字:

上课总结怎么写