您当前的位置:首页 > 配对 > 婚姻配对

681是什么意思(681是什么意思爱情)

时间:2023-10-15 06:20:38 作者:脾气很大 来源:网友上传

本文目录一览:

陕西关中方言的消失已不可逆转(4)

关中话流行于陕甘宁山西河南部分地区,发音浊重,词汇多古语。今使用频率不断下降,词汇和发音亦不断改变。继续记录祖辈使用的语言。

591、 般数,bǎn sǒu 对饮食菜肴花样、道数讲究。般即种、类、样,般数即为样数。唐·寒山《诗三百三首八十五》:“多少般数人,百计求名利。”意为人世间有各种各样的人,千方百计追求名和利。《宫词》:“水中芹叶土中花,拾得还将避众家,总待别人班数尽,袖中拈出郁金芽。”描绘了古代一种斗草游戏,采草人将名贵的花卉暗藏起来,等别人花样用完,再从袖中拈出郁金香压倒群芳夺魁。

592、 飨食xiáng shǐ,炫耀吃食。本意飨食之礼,即古代一种隆重的宴请宾客之礼。《墨子·杂守》提到古人一日两餐。关中地区很多农村至今仍保留一日两餐饮食习惯。《论语》提到“食不时不食”,即在不应进餐的时间用餐,被认为是一种越礼的行为或特别的犒赏。《史记·项羽本纪》记载,项羽听说刘邦欲王关中,曾怒而下令“且日飨士卒”,借此犒劳将士,激发士气。

593、 臭肨pǎng虫,臭虫。《广韵·绛韵》:肨,胀臭貌。《玉篇·肉部》:胀臭貌。

594、 布旒līu絮絮,长条状布。旒,原指旌旗上的梳齿样条带装饰物。《礼记》:旗十有二旒。《玉篇》:旒,旌旗垂者。冰旒子,房檐上的悬垂的珠串状结冰。

596、 霪yín雨,连绵不断过量的雨。如:“雨下霪了,赶紧收衣服。”又如:“雨下的霪唰唰的。”

597、乑yín,众立的样子。如:“娃㞎下了,裤子都侗乑了。”又如:“深圳月薪上万的人乑乑的。”《说文》:读若钦崟,众立也。

598、胤yīn,植物的繁殖或者病灶的扩大。如:“一个草莓苗一年能胤好几苗。”又如:“手上出了个母猴子,胤了好几个。”《说文》:子孙相承续也。从肉从八,象其长也。么亦象重累也。《广韵》:继也,嗣也。

599、 盘,(1)垒,砌。如“盘炕、盘锅”。(2)容器。关中话盘和碟有区分,大且稍深的叫盘。小且浅用于放菜的叫碟。

手里端的叫盘,盘里装菜的叫碟碟

这种比较大的叫盘

600、 伧cēng,性情暴躁,脾气不好。《广韵》:助庚切。《集韵》《韵会》:锄庚切。

601、庵ngǎn子,简陋小屋。如:“果园里搭庵子。”《广雅》:庵,舍也。

602、厦sà子,半边盖的简易房间。如:“穷汉人住的是厦子房。”

603、穷汉人,穷苦人。李商隐《杂纂》:穷汉说大话。

604、醠nǎng,浑浊的样子。如:“黄河水稠醠醠的。”本意是浊酒。《说文》:醠,浊酒也。

605、劥kēng,考究第337。“亢”意为“管子”、“管道”,引申为“唯一的通道或路径”。“力”与“亢”联合起来表示“力量用在唯一的通道或路径上”。本义:力量用准了地方。如:“用砖头把车轱辘劥住。”

606、灵性,聪明。韩愈《芍药歌》:娇痴婢子无灵性,竟挽春衫来比并。

607、浮前,表面。如:“煮鸡汤要把浮前的油漂走,要不汤喝起来太油腻。”王维《汉江临泛》:郡邑浮前浦,波澜动远空。

608、阿家,对婆家的背称。唐·李百药《北齐书·崔达拏传》:初,文宣尝问乐安公主:“达拏于汝何似?”答云:“甚相敬,唯阿家憎儿。”阿公大,对家公的背称。唐·赵璘《因话录·谐戏》:衢州视事际,有妇人姓翁,陈牒论田产,称阿公阿翁在日,坐客笑之。原注:“下阿翁两字,言其大父也。”

609、倏shú,急跑。如:“倏一下跑的不见人影了。”《广雅》:儵,疾也。《汉书·序传》:辰倏忽其不再。注:倏忽,疾也。

610、跾shú,形容脚下灵活。如:“跟猴一样,倏太,在树上跑来跑去的。”《说文》:疾也。

611、纳,密缝。如“纳鞋底”。《篇海》:补缀也。

612、搨tǎ,在刻铸有文字或图像的器物上,涂上墨,蒙上一层纸,捶打后使凹凸分明,显出文字图像来。比如拿一张纸搨在分分钱上面,用铅笔在上面涂一遍,就印出一个分分钱图案。”《唐书·百官志》弘文馆,挍书郞二人,有搨书手笔匠三人。

613、沓tǎ,重叠。如:“冬天盖一个被子冷,上面再沓一个被子。”李白《庐山谣寄卢侍御虚舟》:香炉瀑布遥相望,回崖沓嶂凌苍苍。

614、塌账,欠账。阮章竞《赤叶河》:你娶了媳妇,塌下十块钱窟窿。

615、皴qǔn,皮肤因受冻或受风吹而干裂。如:“小时候一到冬天脸上就皴的跟榆树皮一样。”《梁书·武帝纪》:执笔触寒,手为皴裂。

616、䄩/䴬子,小麦或稻谷或油菜脱落的外壳。《玉篇》:麥䴬,麥㱿破碎者。《集韻》:麥也。

617、辩piān,编。如“辫绞juē子”。《韵会》:平免切《说文》:交织也。《通俗文》:织绳曰辫。

618、挦xián,摘取。如“从鸡窝出来,把身上的鸡毛挦下来。”《集韵》:徐廉切,音爓。摘也。《方言》:挦,取也。

619、肇zháo,一般指用石块或土块等小物件扔出去砸人或物,或者直接用砖等物砸或丢人。如:“拿土疙瘩朝人颡上肇。”《说文解字·攴部》:肇,击也。

620、靸sǎ,修正第523。没有后跟的鞋叫靸sǎ鞋hái,也叫拖鞋。穿鞋时不提起后跟,拖着行走也叫靸着鞋。《说文》:靸,小儿履也。从革,及声。

621、掮jiǎn,指用肩膀扛。如“掮一庄子麦”。《儒林外史》里曾有“掮著一把伞,手里拿著一个衣包。”

622、炕,补充第416。(1)烤。如:“炕油馍”(2)口渴。如:“一天没喝水,把人炕的。”《说文》:炕,干也。从火,亢声。

623、㞎bà,纠正第500。做动词。如“㞎屎”。

624、澉tān,味淡。如:“菜盐放少了,吃到嘴里澉不哔哔ci的。”《玉篇》澉,薄味也。《广韵》《集韵》:吐滥切。亦味薄也。

625、钁jǔe,拚pàn草的农具。《尔雅·释器》:斫谓之鐯。

这个是钁,和锄不同

626、耱mō,用手指粗细的树枝条编在长力一形木框上的一种农具,用来平整翻耕后的土地,使土粒更酥碎些,有时也用来保墒。使用时把耱平放在翻耕过的田地上,由牲畜拉着前进,操作者站立其上,或者用石块放在上面,以增大对土面的压力。也做动词用,耱地。

脚下这个就是耱

627、推刨,木工用具。

628、衍yàn,溢出。如:“把碗端平,走慢些,小心水衍到外头了。” 汉·扬雄《太玄‧法》:井无干,水直衍。陆机《叹逝赋》:居充堂而衍宇,行连驾而比轩。

629、压祟钱,拜年红包。祟是鬼神降祸的意思,压祟钱便是避祸之钱。《战国策·齐策》:寡人不祥,被于宗宙之祟,沉于谄谀之臣,开罪于君。

630、涎hǎn水,口水。《三苍》:涎,小儿唾也。《说文》:慕欲口液也。

631、捦(扲)jǐn,绑,使不脱落。如:“捦裤带、捦鞋带、捦红领巾。”《唐韵》:巨今切。《说文》急持衣衿也。急持,紧紧抱紧之意;衣衿,衣领或袖口。

632、一满(共),总共。如:“一满不到1里路,你就走了半个小时。”

633、奅pāo,说大话虚张声势。如“满嘴放大奅”。《扬子·方言》:以大言冒人曰奅。

634、 勼jīu,聚集。如:“你几辈货成天勼到一堆堆不干好事。”《说文解字》:聚也。从勹九声。

635、䟭qiǎo,跨过,一个脚先伸出,另一个脚跟着跳过去。如:“从渠这边䟭到渠那边。”或者一个脚着地,另一个脚抬高绕过某物后落下。如“䟭尿梢”。《说文解字注》:跳【 卷二 】【 足部 】蹶也。从足兆聲。一曰躍也。徒遼切《汉典》(跳)蹷也。方言。自關而西秦晉之閒曰跳。从足。兆聲。徒遼切。二部。一曰躍也。躍、迅也。其中提到的躍即为跃。跳和跃是有区别的:跳是两脚离地全身向前或向上的动作,而跃是跨过某障碍而前进的动作。䟭字的组成为一个足一个乍,乍有伸开之意,如乍翅。

636、礧luī,(1)堆、砌。如“用石头礧墙”。(2)自上而下滚落。如“坡上往下礧土”。《埤苍》:推石自高而下也。《司马相如·子虚赋》:礧石相击。

637、戳撑chúo cěng,大方有出息。

638、饧xíng,面剂子等变软。如:“饧面”。

639、皙xǐ,人长的白,漂亮。如:“这女子长的白皙白皙的。”《说文》:皙,人色白也。《汉书·霍光传》:白皙疏眉目。

640、 搊cǒu,考正第283。手扶住或一端用力向上使物体立起或翻倒。比如一个人掮(背)起一袋很重的粮食时,需要另一个人辅助搊一下,将粮食放到扛粮食人的肩膀上。一个人要翻墙,上不去,另一个人在下面搊一下。和第368的掫zhou意思不同,掫是从一侧或一端托起重物,只是拖起保持平衡即可,比如,用手把架子车车辕掫住,不要让车翻了。《集韵》《韵会》:初尤切。

641、才,初、刚的意思。如:“我才吃了饭。”宋·柳永《西平乐》:嘉景清明渐近,时节轻寒乍暖,天气才晴又雨。

642、调和,调味用的佐料。如“调和面”。《吕氏春秋·本味》:调和之事,必以甘酸苦辛咸,先后多少,其齐甚微。

643、 洋枧jiàn,枧,肥皂。洋,外来物。

645、旋xuān,用车床切削或用刀子转着圈削。如“旋柿饼”。慧琳《一切经音义》卷九引三国魏周成《周成难字》:旋,谓以绳转轴裁木为器。

646、双双,相并,两手相互插到袖子里暖手,有些地方叫抄手或肉贴肉。

647、贫气,行事、态度不够大方。

648、雾,不清晰。如:“这几天眼窝疼,看啥都是雾vū雾vǔ。”

649、篾mǐe匠,用竹子的薄片编制用品的手艺人。

650、涩seǐ啮nǐe,生锈。《说文》:濇,不滑也。啮,侵蚀。李白《金陵白下亭留别》:汉水啮古根。

651、诨hún话,开玩笑的话。小时候一旦说了不利于自己的话,奶奶就会说不敢说诨话。《唐书·史思明传》:思明爱优诨,寝食常在侧。宋·陈鹄 《耆旧续闻》卷三:“ 坡至都下,就宋氏借本看, 宋氏諸子不肯出,謂東坡滑稽,萬一摘數語作諢話,天下傳爲口實矣。”

652、打岔,多用于表示有意转移话题,表示打断别人讲话多用插嘴。

653、转转,闲逛,散步。如“出去转转”。

654、跟前、方大圆,周围,附近。

655、匀,分出一部分给别人。《一切经音义》引《说文》:匀,调匀也。

656、炝qiàng锅,是指将姜、葱、辣椒沫或其他带有香味的调料放入烧热的底油锅中煸炒出香味,再及时下菜料的一种方法。如“干辣子炝锅”。

657、煨,用灰或麦糠把火埋住让慢慢发热,比如烧炕或者烙油馍煮柿子等,需要保温时用到此方法。《通俗文》:热灰谓之煻煨。煻,即灰中火。

658、墙猫虎逮,捉迷藏。

659、剃头,理发。叫剃头的给你把头一推。

660、一世,一生,一辈子。

661、手巾,毛巾。《太平御览》卷七一六引晋·陈寿 《汉名臣奏》:王莽斥出王闳,太后怜之。闳伏泣失声,太后亲自以手巾拭闳泣。南朝·宋·刘义庆 《世说新语·文学》:谢注神倾意,不觉流汗交面。 殷徐语左右:取手巾与谢郎拭面。《资治通鉴·梁敬帝绍泰元年》:霸先惧其谋泄,以手巾绞稜 。胡三省注:“今人盥洗,以布拭手,长七八尺,谓之手巾。”

662、尖,感觉敏锐。如:“鼻子尖、眼尖”《广韵》:尖,锐也。

663、划不着,不划算,亏,不值得。勤俭节约的老一辈常说的一个词。

664、娃,(1)小孩。(2)幼小动物。(3)和名字最后一个字相连称呼人,如“平娃”。

665、啥蔓蔓结啥蛋蛋,比喻有什么样的父母,就会生出什么样的子女。

666、挑担,连襟。

667、糠,(1)谷壳,如麦糠。《玉篇》谷皮也。(2)发空,萝卜等蔬菜失去水分后变得松软不结实,中心部位出现空洞的情况。

668、稼娃,乡下人。稼,从事农业生产。《荀子·解蔽》:好稼者众矣。

669、尜gá,钱。

670、岸,表示方位。偏岸、兀岸、一岸、东岸、南岸、里岸、外岸、前岸、后岸。

671、兀wū嗒,那里。《注》:指特别远的地方。

672、跑后,拉肚子。因为过去茅房通常在后院,拉稀说的文明点就是给后岸跑。茅房也称后岸。

673、经管娃,看娃。

674、榆木疙瘩,坚硬的榆树根,比喻思想顽固。

675、闩shuān,把门闩上。范成大《桂海虞衡志·杂志》:闩,门横关也。

676、相好的,朋友。

677、扑西来海,邋遢,不整洁,不干净,不利落。

678、风螫sǐ,荨麻疹,旧时认为被风蛰了,所以叫风螫。螫,毒虫或毒蛇咬刺。《史记·田儋传》:蝮螫手则斩手,螫足则斩足。

679、 干辇nián,没有菜把酒送下去。干,空的意思。《礼记·大傅》:大夫士有大事,省于其君,干袷及其高祖。辇,载运、运送之意。陆游《闻虏乱次前辈韵》:辇金输虏庭。

680、 干亲,没有血缘或婚姻关系而结认的亲戚关系。明·文林《琅琊漫抄》:赵氏干娘,高皇(明太祖朱元璋)义父之妻也。

681、 干瞪眼,干着急而没有办法。干,徒然,白白地。唐·韩愈《感春》:干愁漫解坐自累,与众异趣谁相亲。路遥《平凡的世界》第一卷第26章:“等他们知道了,水已经到了咱们村,他们也只能干瞪眼!”

682、 黡子,黑痣。《史记·高祖本纪》:左股有七十二黑子。唐·张守节《正义》:许北人呼为‘黶子’, 吴 楚 谓之‘誌’。誌,记也。”

683、记,皮肤上的生下来就有的深色斑。《廣韻》:志也。

684、 曳蔓yé vān,蔓延,牵蔓。如“南瓜苗曳蔓”。曳,延长伸展。

685、 不美,常用于表示身体不舒服。如:“这两天不美,感冒了。”不美气,关系不好。如:“弟兄俩为了分家产的事弄的两家不美气。”

686、 老婆,年老的妇女。唐寒山《诗》之三六:“东家一老婆,富来三五年;昔日贫於我,今笑我无钱。”最初含义是老年妇女,后来才用来指自己妻子。

687、官,公有的。如“官墙”。《汉书·盖宽饶传》引《韩氏易传》:五帝官天下,三王家天下,家以传子,官以传贤。

688、糟zǎo,豆腐碎成渣叫㷮了。原指带滓的酒。

689、 毛不顺,逆反。如:“这货最近有些毛不顺,见了女娃光说骚话,需要修理一下!”

690、 人来疯,指小孩在有客人来时胡闹。

691、 育不熟,无论对你多好,都不会跟你一条心。

692、 生生,(1)相对于熟。(2)打架不计后果。(3)硬是。如:“尕娃放羊就知道耍手机,怂心不操,一群羊生生把疍娃家一亩苞谷苗吃光了。”

693、 见不得,(1)看不惯,讨厌。如:“我见不得你。”(2)不愿看见。如:“你就是见不得别人比你好。”(3)不能让人知道。如:“你干了啥见不得人的事。”

694、 难缠,是指人难以对付,不易打交道。《红楼梦·第六六回》:主子宽了你们又这样,严了又抱怨,可知难缠。

695、 不对火,不对劲。如:“一看不对火,撒腿就跑。”

696、 栽,(1)栽树。《广韵》:栽,种也。(2)摔跤。小孩学习走路时,大人常用“栽zǎi”或“栽zái栽zǎi”警示小孩慢走,小心摔倒。

697、 大手,花钱不节制,和细发相反。

698、 轻瓢,形容重量轻如瓢,瓢即葫芦干壳做的舀水的瓢。《三苍》:瓢,瓠勺也。

699、 溃huī脓,溃烂化脓。《素问·五常政大论》:其动疡涌分溃痈肿。王冰注:溃,烂也。《唐韵》《集韵》《韵会》《正韵》:竝胡对切。音绘。

700、 兀剌,源自一溜兀剌,指形容说话别人听不清或听不懂。如:“嘴里兀喇兀喇的不知道说啥。”

701、 宽展,手头宽裕。《醒世恒言·两县令竞义婚孤女》:老媳妇到有个外甥在身边,三十岁了,老媳妇原许下与他娶一房妻小的。因手头不宽展,捱下去。这到是雌雄一对儿。

702、 焵gāng,烟类气体四散或升空。如“焵气”。冬天喝到热气腾腾的米汤也叫喝了焹。

703、 幫bǎng,物体旁边竖起的部分,鞋边缘叫鞋幫。元·关汉卿《拜月亭·第一折》:這一對繡鞋兒分不得幫和底。

704、 榯shí,从炕上榯起来。《注》:直竖貌。《唐韵》《集韵》:市之切,音时。

705、 蛤蟆咕嘟,蝌蚪。也叫蛤蟆鱼鱼或一种面做的像蝌蚪的食物。

706、 擩rǔ,插,塞,踩入。如:“脚擩到稀泥里了。”又如:“馍擩到菜水水里蘸汁。”

707、 鋬pān,器物上用手提的部分。如“桶鋬,壶鋬,笼鋬”。《集韵》:鋬,器系。

708、

nóu 、脏。如:“你看你手,刚修完车,黑~黑~的。”《玉篇》:垢黑也。

709、 置,购买,添加。如“置家具”。

710、 梏gù,考证第503。把人缠住了,粘住了。古代用来控制犯人双手的工具,同今天的手铐。如:“你把人还给梏住了。”《说文》:梏,手械也。

711、 车闸,闸,即安装在某些机械上能随时使机械停止运行的设备,车闸即刹车装置。

712、 熟油,熟做动词表示加热油。如:“熟些油泼油泼面。”

713、 蹾dǔn,重着地。如“勾子蹾”,又如:“从华山走下来,蹾的腿疼。”

714、荘,把棉花或棉絮放进缝好的布里面去。如“荘被子”。

715、 撒踅xué,地上打滚,撒娇。踅,转身,旋转。如:“一岁多的女儿一不满意,就在地上撒踅。”

716、稙zhǐ,庄稼种得早些或熟得早些。如“稙苞谷”。《诗·鲁颂·閟宫》毛传:“先种曰植,后种曰稚。”

717、冰bīng,把东西放凉水里使变凉。当凉或名词冰的时候发bǐng,当使变凉的时候发bīng。如:“把煎水放凉水里冰一会就凉了。”

718、 打颤zhān,哆嗦,发抖,多指害怕,寒冷时的动作。《说文》:“颤,头不正也。从页,亶声。”段玉裁注改为:“头不定也”。颤字之本义为头摇摆不定,故引申为颤动之颤。《淮南子·说山》:故寒,颤;惧者亦颤。

719、海蚆,河蚌。一些地区将河蚌称为海蚆。

720、胰子,肥皂,考正第320。胰子是我国古代发明的一种含有猪胰脏和草木灰成分的复合洗涤用品。

721、 㾭jīu,形容收缩的动作叫“㾭”,纠正第163。《集韵》:卽就切,音僦。义同。《博雅》:㾭,缩也。

722、 跼jǔ,屈曲不舒展。如:“鞋有点小,把人脚跼的疼。”《广韵》:跼,曲也。《集韵》:跼,蜷跼,不伸也。

723、犯病,因某事对人有意见了。

724、吆,驱赶。如“吆鹔子”。

725、 把式,行家,老手。

726、 拾,捡,关中话会说路上拾了一分钱。拾的本意即为拾取。《说文》拾,掇也。而捡本意同“检”,查符合度,拾取是衍生义。

727、燎,近火而烧焦。如“火把毛燎了”。唐·杜牧《阿房宫赋》:发一灯可燎阿房。

728、 拽zhuàn,神气,骄傲,张扬,富有的样子。如:“这人拽的很,问话都不理识。”

729、 诞dān,考正第292个字。诞闲的,诞话。本义为说大话,引申为欺诈,荒唐,谎话《说文解字》:诞,词诞也。

730、 條帚和䈾帚,用高粱穗做的扫室内的叫條帚,用金枝竹或扫帚草做的扫室外的叫䈾帚。

731、 夜彪虎,蝙蝠。

732、 花不愣登,形容颜色多而乱。

733、 顶嘴,拌嘴,争辩,顶撞,多指对长辈。

陕西关中方言的消失已不可逆转(4)

关中话流行于陕甘宁山西河南部分地区,发音浊重,词汇多古语。今使用频率不断下降,词汇和发音亦不断改变。继续记录祖辈使用的语言。

591、 般数,bǎn sǒu 对饮食菜肴花样、道数讲究。般即种、类、样,般数即为样数。唐·寒山《诗三百三首八十五》:“多少般数人,百计求名利。”意为人世间有各种各样的人,千方百计追求名和利。《宫词》:“水中芹叶土中花,拾得还将避众家,总待别人班数尽,袖中拈出郁金芽。”描绘了古代一种斗草游戏,采草人将名贵的花卉暗藏起来,等别人花样用完,再从袖中拈出郁金香压倒群芳夺魁。

592、 飨食xiáng shǐ,炫耀吃食。本意飨食之礼,即古代一种隆重的宴请宾客之礼。《墨子·杂守》提到古人一日两餐。关中地区很多农村至今仍保留一日两餐饮食习惯。《论语》提到“食不时不食”,即在不应进餐的时间用餐,被认为是一种越礼的行为或特别的犒赏。《史记·项羽本纪》记载,项羽听说刘邦欲王关中,曾怒而下令“且日飨士卒”,借此犒劳将士,激发士气。

593、 臭肨pǎng虫,臭虫。《广韵·绛韵》:肨,胀臭貌。《玉篇·肉部》:胀臭貌。

594、 布旒līu絮絮,长条状布。旒,原指旌旗上的梳齿样条带装饰物。《礼记》:旗十有二旒。《玉篇》:旒,旌旗垂者。冰旒子,房檐上的悬垂的珠串状结冰。

596、 霪yín雨,连绵不断过量的雨。如:“雨下霪了,赶紧收衣服。”又如:“雨下的霪唰唰的。”

597、乑yín,众立的样子。如:“娃㞎下了,裤子都侗乑了。”又如:“深圳月薪上万的人乑乑的。”《说文》:读若钦崟,众立也。

598、胤yīn,植物的繁殖或者病灶的扩大。如:“一个草莓苗一年能胤好几苗。”又如:“手上出了个母猴子,胤了好几个。”《说文》:子孙相承续也。从肉从八,象其长也。么亦象重累也。《广韵》:继也,嗣也。

599、 盘,(1)垒,砌。如“盘炕、盘锅”。(2)容器。关中话盘和碟有区分,大且稍深的叫盘。小且浅用于放菜的叫碟。

手里端的叫盘,盘里装菜的叫碟碟

这种比较大的叫盘

600、 伧cēng,性情暴躁,脾气不好。《广韵》:助庚切。《集韵》《韵会》:锄庚切。

601、庵ngǎn子,简陋小屋。如:“果园里搭庵子。”《广雅》:庵,舍也。

602、厦sà子,半边盖的简易房间。如:“穷汉人住的是厦子房。”

603、穷汉人,穷苦人。李商隐《杂纂》:穷汉说大话。

604、醠nǎng,浑浊的样子。如:“黄河水稠醠醠的。”本意是浊酒。《说文》:醠,浊酒也。

605、劥kēng,考究第337。“亢”意为“管子”、“管道”,引申为“唯一的通道或路径”。“力”与“亢”联合起来表示“力量用在唯一的通道或路径上”。本义:力量用准了地方。如:“用砖头把车轱辘劥住。”

606、灵性,聪明。韩愈《芍药歌》:娇痴婢子无灵性,竟挽春衫来比并。

607、浮前,表面。如:“煮鸡汤要把浮前的油漂走,要不汤喝起来太油腻。”王维《汉江临泛》:郡邑浮前浦,波澜动远空。

608、阿家,对婆家的背称。唐·李百药《北齐书·崔达拏传》:初,文宣尝问乐安公主:“达拏于汝何似?”答云:“甚相敬,唯阿家憎儿。”阿公大,对家公的背称。唐·赵璘《因话录·谐戏》:衢州视事际,有妇人姓翁,陈牒论田产,称阿公阿翁在日,坐客笑之。原注:“下阿翁两字,言其大父也。”

609、倏shú,急跑。如:“倏一下跑的不见人影了。”《广雅》:儵,疾也。《汉书·序传》:辰倏忽其不再。注:倏忽,疾也。

610、跾shú,形容脚下灵活。如:“跟猴一样,倏太,在树上跑来跑去的。”《说文》:疾也。

611、纳,密缝。如“纳鞋底”。《篇海》:补缀也。

612、搨tǎ,在刻铸有文字或图像的器物上,涂上墨,蒙上一层纸,捶打后使凹凸分明,显出文字图像来。比如拿一张纸搨在分分钱上面,用铅笔在上面涂一遍,就印出一个分分钱图案。”《唐书·百官志》弘文馆,挍书郞二人,有搨书手笔匠三人。

613、沓tǎ,重叠。如:“冬天盖一个被子冷,上面再沓一个被子。”李白《庐山谣寄卢侍御虚舟》:香炉瀑布遥相望,回崖沓嶂凌苍苍。

614、塌账,欠账。阮章竞《赤叶河》:你娶了媳妇,塌下十块钱窟窿。

615、皴qǔn,皮肤因受冻或受风吹而干裂。如:“小时候一到冬天脸上就皴的跟榆树皮一样。”《梁书·武帝纪》:执笔触寒,手为皴裂。

616、䄩/䴬子,小麦或稻谷或油菜脱落的外壳。《玉篇》:麥䴬,麥㱿破碎者。《集韻》:麥也。

617、辩piān,编。如“辫绞juē子”。《韵会》:平免切《说文》:交织也。《通俗文》:织绳曰辫。

618、挦xián,摘取。如“从鸡窝出来,把身上的鸡毛挦下来。”《集韵》:徐廉切,音爓。摘也。《方言》:挦,取也。

619、肇zháo,一般指用石块或土块等小物件扔出去砸人或物,或者直接用砖等物砸或丢人。如:“拿土疙瘩朝人颡上肇。”《说文解字·攴部》:肇,击也。

620、靸sǎ,修正第523。没有后跟的鞋叫靸sǎ鞋hái,也叫拖鞋。穿鞋时不提起后跟,拖着行走也叫靸着鞋。《说文》:靸,小儿履也。从革,及声。

621、掮jiǎn,指用肩膀扛。如“掮一庄子麦”。《儒林外史》里曾有“掮著一把伞,手里拿著一个衣包。”

622、炕,补充第416。(1)烤。如:“炕油馍”(2)口渴。如:“一天没喝水,把人炕的。”《说文》:炕,干也。从火,亢声。

623、㞎bà,纠正第500。做动词。如“㞎屎”。

624、澉tān,味淡。如:“菜盐放少了,吃到嘴里澉不哔哔ci的。”《玉篇》澉,薄味也。《广韵》《集韵》:吐滥切。亦味薄也。

625、钁jǔe,拚pàn草的农具。《尔雅·释器》:斫谓之鐯。

这个是钁,和锄不同

626、耱mō,用手指粗细的树枝条编在长力一形木框上的一种农具,用来平整翻耕后的土地,使土粒更酥碎些,有时也用来保墒。使用时把耱平放在翻耕过的田地上,由牲畜拉着前进,操作者站立其上,或者用石块放在上面,以增大对土面的压力。也做动词用,耱地。

脚下这个就是耱

627、推刨,木工用具。

628、衍yàn,溢出。如:“把碗端平,走慢些,小心水衍到外头了。” 汉·扬雄《太玄‧法》:井无干,水直衍。陆机《叹逝赋》:居充堂而衍宇,行连驾而比轩。

629、压祟钱,拜年红包。祟是鬼神降祸的意思,压祟钱便是避祸之钱。《战国策·齐策》:寡人不祥,被于宗宙之祟,沉于谄谀之臣,开罪于君。

630、涎hǎn水,口水。《三苍》:涎,小儿唾也。《说文》:慕欲口液也。

631、捦(扲)jǐn,绑,使不脱落。如:“捦裤带、捦鞋带、捦红领巾。”《唐韵》:巨今切。《说文》急持衣衿也。急持,紧紧抱紧之意;衣衿,衣领或袖口。

632、一满(共),总共。如:“一满不到1里路,你就走了半个小时。”

633、奅pāo,说大话虚张声势。如“满嘴放大奅”。《扬子·方言》:以大言冒人曰奅。

634、 勼jīu,聚集。如:“你几辈货成天勼到一堆堆不干好事。”《说文解字》:聚也。从勹九声。

635、䟭qiǎo,跨过,一个脚先伸出,另一个脚跟着跳过去。如:“从渠这边䟭到渠那边。”或者一个脚着地,另一个脚抬高绕过某物后落下。如“䟭尿梢”。《说文解字注》:跳【 卷二 】【 足部 】蹶也。从足兆聲。一曰躍也。徒遼切《汉典》(跳)蹷也。方言。自關而西秦晉之閒曰跳。从足。兆聲。徒遼切。二部。一曰躍也。躍、迅也。其中提到的躍即为跃。跳和跃是有区别的:跳是两脚离地全身向前或向上的动作,而跃是跨过某障碍而前进的动作。䟭字的组成为一个足一个乍,乍有伸开之意,如乍翅。

636、礧luī,(1)堆、砌。如“用石头礧墙”。(2)自上而下滚落。如“坡上往下礧土”。《埤苍》:推石自高而下也。《司马相如·子虚赋》:礧石相击。

637、戳撑chúo cěng,大方有出息。

638、饧xíng,面剂子等变软。如:“饧面”。

639、皙xǐ,人长的白,漂亮。如:“这女子长的白皙白皙的。”《说文》:皙,人色白也。《汉书·霍光传》:白皙疏眉目。

640、 搊cǒu,考正第283。手扶住或一端用力向上使物体立起或翻倒。比如一个人掮(背)起一袋很重的粮食时,需要另一个人辅助搊一下,将粮食放到扛粮食人的肩膀上。一个人要翻墙,上不去,另一个人在下面搊一下。和第368的掫zhou意思不同,掫是从一侧或一端托起重物,只是拖起保持平衡即可,比如,用手把架子车车辕掫住,不要让车翻了。《集韵》《韵会》:初尤切。

641、才,初、刚的意思。如:“我才吃了饭。”宋·柳永《西平乐》:嘉景清明渐近,时节轻寒乍暖,天气才晴又雨。

642、调和,调味用的佐料。如“调和面”。《吕氏春秋·本味》:调和之事,必以甘酸苦辛咸,先后多少,其齐甚微。

643、 洋枧jiàn,枧,肥皂。洋,外来物。

645、旋xuān,用车床切削或用刀子转着圈削。如“旋柿饼”。慧琳《一切经音义》卷九引三国魏周成《周成难字》:旋,谓以绳转轴裁木为器。

646、双双,相并,两手相互插到袖子里暖手,有些地方叫抄手或肉贴肉。

647、贫气,行事、态度不够大方。

648、雾,不清晰。如:“这几天眼窝疼,看啥都是雾vū雾vǔ。”

649、篾mǐe匠,用竹子的薄片编制用品的手艺人。

650、涩seǐ啮nǐe,生锈。《说文》:濇,不滑也。啮,侵蚀。李白《金陵白下亭留别》:汉水啮古根。

651、诨hún话,开玩笑的话。小时候一旦说了不利于自己的话,奶奶就会说不敢说诨话。《唐书·史思明传》:思明爱优诨,寝食常在侧。宋·陈鹄 《耆旧续闻》卷三:“ 坡至都下,就宋氏借本看, 宋氏諸子不肯出,謂東坡滑稽,萬一摘數語作諢話,天下傳爲口實矣。”

652、打岔,多用于表示有意转移话题,表示打断别人讲话多用插嘴。

653、转转,闲逛,散步。如“出去转转”。

654、跟前、方大圆,周围,附近。

655、匀,分出一部分给别人。《一切经音义》引《说文》:匀,调匀也。

656、炝qiàng锅,是指将姜、葱、辣椒沫或其他带有香味的调料放入烧热的底油锅中煸炒出香味,再及时下菜料的一种方法。如“干辣子炝锅”。

657、煨,用灰或麦糠把火埋住让慢慢发热,比如烧炕或者烙油馍煮柿子等,需要保温时用到此方法。《通俗文》:热灰谓之煻煨。煻,即灰中火。

658、墙猫虎逮,捉迷藏。

659、剃头,理发。叫剃头的给你把头一推。

660、一世,一生,一辈子。

661、手巾,毛巾。《太平御览》卷七一六引晋·陈寿 《汉名臣奏》:王莽斥出王闳,太后怜之。闳伏泣失声,太后亲自以手巾拭闳泣。南朝·宋·刘义庆 《世说新语·文学》:谢注神倾意,不觉流汗交面。 殷徐语左右:取手巾与谢郎拭面。《资治通鉴·梁敬帝绍泰元年》:霸先惧其谋泄,以手巾绞稜 。胡三省注:“今人盥洗,以布拭手,长七八尺,谓之手巾。”

662、尖,感觉敏锐。如:“鼻子尖、眼尖”《广韵》:尖,锐也。

663、划不着,不划算,亏,不值得。勤俭节约的老一辈常说的一个词。

664、娃,(1)小孩。(2)幼小动物。(3)和名字最后一个字相连称呼人,如“平娃”。

665、啥蔓蔓结啥蛋蛋,比喻有什么样的父母,就会生出什么样的子女。

666、挑担,连襟。

667、糠,(1)谷壳,如麦糠。《玉篇》谷皮也。(2)发空,萝卜等蔬菜失去水分后变得松软不结实,中心部位出现空洞的情况。

668、稼娃,乡下人。稼,从事农业生产。《荀子·解蔽》:好稼者众矣。

669、尜gá,钱。

670、岸,表示方位。偏岸、兀岸、一岸、东岸、南岸、里岸、外岸、前岸、后岸。

671、兀wū嗒,那里。《注》:指特别远的地方。

672、跑后,拉肚子。因为过去茅房通常在后院,拉稀说的文明点就是给后岸跑。茅房也称后岸。

673、经管娃,看娃。

674、榆木疙瘩,坚硬的榆树根,比喻思想顽固。

675、闩shuān,把门闩上。范成大《桂海虞衡志·杂志》:闩,门横关也。

676、相好的,朋友。

677、扑西来海,邋遢,不整洁,不干净,不利落。

678、风螫sǐ,荨麻疹,旧时认为被风蛰了,所以叫风螫。螫,毒虫或毒蛇咬刺。《史记·田儋传》:蝮螫手则斩手,螫足则斩足。

679、 干辇nián,没有菜把酒送下去。干,空的意思。《礼记·大傅》:大夫士有大事,省于其君,干袷及其高祖。辇,载运、运送之意。陆游《闻虏乱次前辈韵》:辇金输虏庭。

680、 干亲,没有血缘或婚姻关系而结认的亲戚关系。明·文林《琅琊漫抄》:赵氏干娘,高皇(明太祖朱元璋)义父之妻也。

681、 干瞪眼,干着急而没有办法。干,徒然,白白地。唐·韩愈《感春》:干愁漫解坐自累,与众异趣谁相亲。路遥《平凡的世界》第一卷第26章:“等他们知道了,水已经到了咱们村,他们也只能干瞪眼!”

682、 黡子,黑痣。《史记·高祖本纪》:左股有七十二黑子。唐·张守节《正义》:许北人呼为‘黶子’, 吴 楚 谓之‘誌’。誌,记也。”

683、记,皮肤上的生下来就有的深色斑。《廣韻》:志也。

684、 曳蔓yé vān,蔓延,牵蔓。如“南瓜苗曳蔓”。曳,延长伸展。

685、 不美,常用于表示身体不舒服。如:“这两天不美,感冒了。”不美气,关系不好。如:“弟兄俩为了分家产的事弄的两家不美气。”

686、 老婆,年老的妇女。唐寒山《诗》之三六:“东家一老婆,富来三五年;昔日贫於我,今笑我无钱。”最初含义是老年妇女,后来才用来指自己妻子。

687、官,公有的。如“官墙”。《汉书·盖宽饶传》引《韩氏易传》:五帝官天下,三王家天下,家以传子,官以传贤。

688、糟zǎo,豆腐碎成渣叫㷮了。原指带滓的酒。

689、 毛不顺,逆反。如:“这货最近有些毛不顺,见了女娃光说骚话,需要修理一下!”

690、 人来疯,指小孩在有客人来时胡闹。

691、 育不熟,无论对你多好,都不会跟你一条心。

692、 生生,(1)相对于熟。(2)打架不计后果。(3)硬是。如:“尕娃放羊就知道耍手机,怂心不操,一群羊生生把疍娃家一亩苞谷苗吃光了。”

693、 见不得,(1)看不惯,讨厌。如:“我见不得你。”(2)不愿看见。如:“你就是见不得别人比你好。”(3)不能让人知道。如:“你干了啥见不得人的事。”

694、 难缠,是指人难以对付,不易打交道。《红楼梦·第六六回》:主子宽了你们又这样,严了又抱怨,可知难缠。

695、 不对火,不对劲。如:“一看不对火,撒腿就跑。”

696、 栽,(1)栽树。《广韵》:栽,种也。(2)摔跤。小孩学习走路时,大人常用“栽zǎi”或“栽zái栽zǎi”警示小孩慢走,小心摔倒。

697、 大手,花钱不节制,和细发相反。

698、 轻瓢,形容重量轻如瓢,瓢即葫芦干壳做的舀水的瓢。《三苍》:瓢,瓠勺也。

699、 溃huī脓,溃烂化脓。《素问·五常政大论》:其动疡涌分溃痈肿。王冰注:溃,烂也。《唐韵》《集韵》《韵会》《正韵》:竝胡对切。音绘。

700、 兀剌,源自一溜兀剌,指形容说话别人听不清或听不懂。如:“嘴里兀喇兀喇的不知道说啥。”

701、 宽展,手头宽裕。《醒世恒言·两县令竞义婚孤女》:老媳妇到有个外甥在身边,三十岁了,老媳妇原许下与他娶一房妻小的。因手头不宽展,捱下去。这到是雌雄一对儿。

702、 焵gāng,烟类气体四散或升空。如“焵气”。冬天喝到热气腾腾的米汤也叫喝了焹。

703、 幫bǎng,物体旁边竖起的部分,鞋边缘叫鞋幫。元·关汉卿《拜月亭·第一折》:這一對繡鞋兒分不得幫和底。

704、 榯shí,从炕上榯起来。《注》:直竖貌。《唐韵》《集韵》:市之切,音时。

705、 蛤蟆咕嘟,蝌蚪。也叫蛤蟆鱼鱼或一种面做的像蝌蚪的食物。

706、 擩rǔ,插,塞,踩入。如:“脚擩到稀泥里了。”又如:“馍擩到菜水水里蘸汁。”

707、 鋬pān,器物上用手提的部分。如“桶鋬,壶鋬,笼鋬”。《集韵》:鋬,器系。

708、

nóu 、脏。如:“你看你手,刚修完车,黑~黑~的。”《玉篇》:垢黑也。

709、 置,购买,添加。如“置家具”。

710、 梏gù,考证第503。把人缠住了,粘住了。古代用来控制犯人双手的工具,同今天的手铐。如:“你把人还给梏住了。”《说文》:梏,手械也。

711、 车闸,闸,即安装在某些机械上能随时使机械停止运行的设备,车闸即刹车装置。

712、 熟油,熟做动词表示加热油。如:“熟些油泼油泼面。”

713、 蹾dǔn,重着地。如“勾子蹾”,又如:“从华山走下来,蹾的腿疼。”

714、荘,把棉花或棉絮放进缝好的布里面去。如“荘被子”。

715、 撒踅xué,地上打滚,撒娇。踅,转身,旋转。如:“一岁多的女儿一不满意,就在地上撒踅。”

716、稙zhǐ,庄稼种得早些或熟得早些。如“稙苞谷”。《诗·鲁颂·閟宫》毛传:“先种曰植,后种曰稚。”

717、冰bīng,把东西放凉水里使变凉。当凉或名词冰的时候发bǐng,当使变凉的时候发bīng。如:“把煎水放凉水里冰一会就凉了。”

718、 打颤zhān,哆嗦,发抖,多指害怕,寒冷时的动作。《说文》:“颤,头不正也。从页,亶声。”段玉裁注改为:“头不定也”。颤字之本义为头摇摆不定,故引申为颤动之颤。《淮南子·说山》:故寒,颤;惧者亦颤。

719、海蚆,河蚌。一些地区将河蚌称为海蚆。

720、胰子,肥皂,考正第320。胰子是我国古代发明的一种含有猪胰脏和草木灰成分的复合洗涤用品。

721、 㾭jīu,形容收缩的动作叫“㾭”,纠正第163。《集韵》:卽就切,音僦。义同。《博雅》:㾭,缩也。

722、 跼jǔ,屈曲不舒展。如:“鞋有点小,把人脚跼的疼。”《广韵》:跼,曲也。《集韵》:跼,蜷跼,不伸也。

723、犯病,因某事对人有意见了。

724、吆,驱赶。如“吆鹔子”。

725、 把式,行家,老手。

726、 拾,捡,关中话会说路上拾了一分钱。拾的本意即为拾取。《说文》拾,掇也。而捡本意同“检”,查符合度,拾取是衍生义。

727、燎,近火而烧焦。如“火把毛燎了”。唐·杜牧《阿房宫赋》:发一灯可燎阿房。

728、 拽zhuàn,神气,骄傲,张扬,富有的样子。如:“这人拽的很,问话都不理识。”

729、 诞dān,考正第292个字。诞闲的,诞话。本义为说大话,引申为欺诈,荒唐,谎话《说文解字》:诞,词诞也。

730、 條帚和䈾帚,用高粱穗做的扫室内的叫條帚,用金枝竹或扫帚草做的扫室外的叫䈾帚。

731、 夜彪虎,蝙蝠。

732、 花不愣登,形容颜色多而乱。

733、 顶嘴,拌嘴,争辩,顶撞,多指对长辈。

图卷积网络-多标签分类

首先理解一些以下:

二分类:每一张图像输出一个类别信息

多类别分类:每一张图像输出一个类别信息

多输出分类:每一张图像输出固定个类别的信息

多标签分类:每一张图像输出类别的个数不固定,如下图所示:

多标签分类的一个重要特点就是标签是具有关联的,比如在含有sky(天空) 的图像中,极有可能含有cloud(云)、sunset(日落)等。

早期进行多标签分类使用的是Binary Cross-Entropy (BCE) or SoftMargin loss,这里我们进一步深入。

如何利用这种依赖关系来提升分类的性能?

其中之一的解决方法就是图卷积网络,例如:

Multi-Label Image Recognition with Graph Convolutional Networks

Cross-Modality Attention with Semantic Graph Embedding for Multi-Label Classification

那么什么是图呢?

图是描述对象之间关系的一种结构。对象可以用nodes(节点)表示,对象间的关系可以用edges(边)来表示,而每条边是可以带有权重的。

接下来看个例子:

假设我们现在有以下标签:sky、cloud、sunset、sea和以下样本:

1: ‘Sea’, ‘Sky’, ‘Sunset

2: ‘Sky’, ‘Sunset’

3: ‘Sky’, ‘Cloud’

4: ‘Sea’, ‘Sunset’

5: ‘Sunset’, ‘Sea’

6: ‘Sea’, ‘Sky’

7: ‘Sky’, ‘Sunset’

8: ‘Sunset’

我们可以将标签用节点表示,但是怎么表示它们之间的关系呢?我们发现有些标签总是成对出现的,可以用$ P(L_{ j} | L_{ i} )来衡量当来衡量当L_{i}标签出现时,标签出现时,L_{j}$标签出现的可能性。

怎么将这种表示应用到我们的模型中?

使用邻接矩阵。比如:表示两标签同时出现的次数

然后可以计算出每个标签出现的总次数:

接着就可以出现标签联合出现的概率了Pi=Ai/NiPi=Ai/Ni,以邻接矩阵第一行为例:

p(sea,sky)=2/5=0.4 p(sea,sunset)=3/6=0.5

于是就有:

最后,别忘了将对角线置为1,因为各自发生的概率值是1.

将关系用图表示:

需要注意的是,

$ P(L_{i } | L_{j } )和和 P(L_{j } | L_{ i} )$之间的概率是不一样的。

图卷积和普通卷积的区别是什么?

图片出自: A Comprehensive Survey on Graph Neural Networks .

上图就很清楚的展示了它们之间的区别: 在卷积神经网络中,利用卷积核来提取信息。类似地,图卷积层使用特定图节点的邻居在其中定义卷积运算。 如果两个节点具有公共边缘,则它们是邻居。 在图卷积中,可学习的权重乘以特定节点(包括节点本身)的所有邻居的特征,然后在结果之上应用一些激活函数。

这里N是节点vivi的邻居节点的索引集(它也包括i),W是一个可学习的权重,对于邻居中的所有节点都是相同的,而f是一些非线性激活函数。cijcij是对称归一化矩阵中边缘(vivi,vjvj)的常数参数。 我们通过将逆度矩阵D与二进制邻接矩阵A相乘来计算此矩阵(我们将描述如何从加权后的矩阵中进一步获得二进制邻接矩阵),因此对输入图计算一次对称归一化矩阵,如下所示:

怎么定义图卷积网络?

现在,我们概述在示例中将使用的整个GCN管道。 我们有一个带有С节点的图,我们想应用GCN。 图卷积运算的目标是学习输入/输出功能。 作为输入,它使用一个С×D特征矩阵(D是输入特征的维数)和一个以矩阵形式表示图形结构的加权邻接矩阵P。然后,以ReLU作为激活函数依次应用几个图卷积。 图卷积运算的输出是一个CxF特征矩阵,其中F是每个节点的输出特征数。

class GraphConvolution(nn.Module): """ Simple GCN layer, similar to /d/file/gt/2023-09/qenk5ptpzwo.02907 """ def __init__(self, in_features, out_features, bias=False): super(GraphConvolution, self).__init__() self_features = in_features self.out_features = out_features self.weight = Parameter( torch.Tensor(in_features, out_features), requires_grad=True) if bias: self.bias = Parameter( torch.Tensor(1, 1, out_features), requires_grad=True) else: self.register_parameter('bias', None) self.reset_parameters() def reset_parameters(self): stdv = 1. / math.sqrt(self.weight.size(1)) self.weight.data.uniform_(-stdv, stdv) if self.bias is not None: self.bias.data.uniform_(-stdv, stdv) def forward(self, input, adj): support = torch.matmul(input.float(), self.weight.float()) output = torch.matmul(adj, support) if self.bias is not None: return output + self.bias else: return output def __repr__(self): return self.__class__.__name__ + ' (' \ + str(self_features) + ' -> ' \ + str(self.out_features) + ')'

标签向量化?

我们刚刚讨论了GCN的工作原理,以及它们如何将特征矩阵作为每个节点具有特征向量的输入。 不过,在我们的任务中,我们为标签准备任何特征,只有标签的名称。 在神经网络中处理文本时,通常使用单词的矢量表示。 每个向量在语料库(词典)的所有单词的空间中代表一个特定的单词,在该空间上已计算出该单词。 单词的空间对于找到单词之间的关系是必不可少的:向量在此空间中彼此越靠近,其含义就越接近。 看看t-SNE的功能可视化帖子,以获取有关如何从我们的数据集的小子集中为标签构建此类图像的想法。

这里可去参考: t-SNE for feature visualization post

您会看到在功能空间中具有紧密含义的单词(如天空,太阳,云彩)接近。获取此空间有多种方法: There are various approaches ,在我们的示例中,我们使用基于Wikipedia的GloVe模型,特征向量的长度为300。

多标签图卷积网络:直接看原文。

We are going to implement the approach from the Multi-Label Image Recognition with Graph Convolutional Networks paper. It consists of applying all the steps described earlier:

Calculate a weighted adjacency matrix from the training set.Calculate the matrix with per-label features: X=LxDUse vectorized labels X and weighted adjacency matrix P as the input of the graph neural network, and preprocessed image as the input for the CNN network.Train the model!

加权邻接矩阵阈值:

为了避免过度拟合,我们在加权邻接矩阵中对概率小于某个阈值τ的对(我们使用τ= 0.1)进行过滤。 我们认为这样的边缘表示不佳或错误连接。 例如,由于训练数据中的噪声,可能会发生这种情况。 例如,在我们的案例中,这种联系是“鸟”和“夜间”:它们表示随机的巧合,而不是真实的关系。

过度平滑问题:

应用图卷积层后,该节点的特征将为其自身特征与相邻节点的特征的加权总和。

这可能会导致特定节点中的特征过度平滑,尤其是在应用了几层之后。 为了防止这种情况,我们引入了参数p,该参数用于校准分配给节点本身和其他相关节点的权重。 这样,在更新节点特征时,我们将对节点本身具有固定的权重,并且其邻居节点的权重将由邻域分布确定。 当p→1时,将不考虑节点本身的特征。 另一方面,当p→0时,邻近信息趋于被忽略。 在我们的实验中,我们使用p = 0.25。

最后,让我们使用GCN构建模型。 我们将ResNeXt50的前4层用作视觉特征提取器,并将多层GCN用作标签关系提取器。 然后,通过点积运算将图像本身的特征和标签进行合并。 请参阅以下方案:

# Create adjacency matrix from statistics.def gen_A(num_classes, t, p, adj_data): adj = np.array(adj_data['adj']).astype(np.float32) nums = np.array(adj_data['nums']).astype(np.float32) nums = nums[:, np.newaxis] adj = adj / nums adj[adj < t] = 0 adj[adj >= t] = 1 adj = adj * p / (adj.sum(0, keepdims=True) + 1e-6) adj = adj + np.identity(num_classes, npt) return adj# Apply adjacency matrix re-normalization trick.def gen_adj(A): D = torch.pow(A.sum(1).float(), -0.5) D = torch.diag(D).type_as(A) adj = torch.matmul(torch.matmul(A, D).t(), D) return adjclass GCNResnext50(nn.Module): def __init__(self, n_classes, adj_path, in_channel=300, t=0.1, p=0.25): super().__init__() self.sigm = nn.Sigmoid() self.features = models.resnext50_32x4d(pretrained=True) self.features.fc = nn.Identity() self.num_classes = n_classes self.gc1 = GraphConvolution(in_channel, 1024) self.gc2 = GraphConvolution(1024, 2048) self.relu = nn.LeakyReLU(0.2) # Load statistics data for adjacency matrix with open(adj_path) as fp: adj_data = json.load(fp) # Compute adjacency matrix adj = gen_A(n_classes, t, p, adj_data) self.A = Parameter(torch.from_numpy(adj).float(), requires_grad=False) def forward(self, imgs, inp): # Get visual features from image feature = self.features(imgs) feature = feature.view(feature.size(0), -1) # Get graph features from graph inp = inp[0].squeeze() adj = gen_adj(self.A).detach() x = self.gc1(inp, adj) x = self.relu(x) x = self.gc2(x, adj) # We multiply the features from GCN and CNN in order to # take into account the contribution to the prediction of # classes from both the image and the graph. x = x.transpose(0, 1) x = torch.matmul(feature, x) return self.sigm(x)

完整代码:https://github/spmallick/learnopencv/tree/master/Graph-Convolutional-Networks-Model-Relations-In-Data

开始动手:

1、安装相应的包

# Install requirements!pip install numpy scikit-image scipy scikit-learn matplotlib tqdm tensorflow torch torchvision2、导入相关的包

import itertoolsimport jsonimport mathimport osimport randomimport tarfileimport timeimport urllib.requestimport zipfilefrom shutil import copyfileimport numpy as npimport requestsimport torchfrom PIL import Imagefrom matplotlib import pyplot as pltfrom numpy import printoptionsfrom sklearn.manifold import TSNEfrom sklearntrics import precision_score, recall_score, f1_scorefrom torch import nnfrom torch.nn import Parameterfrom torch.utils.data.dataloader import DataLoaderfrom torch.utils.data.dataset import Datasetfrom torch.utils.tensorboard import SummaryWriterfrom torchvision import modelsfrom torchvision import transformsfrom tqdm import tqdm3、设置随机种子

# Fix all seeds to make experiments reproducible.torch.manual_seed(2020)torch.cuda.manual_seed(2020)np.random.seed(2020)random.seed(2020)torch.backends.cudnn.deterministic = True4、获取数据集

# We use the .tar.gz archive from this(/d/file/gt/2023-09/y33ng4vmsz1 # github repository to speed up image loading(instead of loading it from Flickr).# Let's download and extract it.img_folder = 'images'if not os.path.exists(img_folder): def download_file_from_google_drive(id, destination): def get_confirm_token(response): for key, value in responseokies.items(): if key.startswith('download_warning'): return value return None def save_response_content(response, destination): CHUNK_SIZE = 32768 with open(destination, "wb") as f: for chunk in tqdm(response.iter_content(CHUNK_SIZE), desc='Image downloading'): if chunk: # filter out keep-alive new chunks f.write(chunk) URL = "https://docs.google/uc?export=download" session = requests.Session() response = session.get(URL, params={'id': id}, stream=True) token = get_confirm_token(response) if token: params = {'id': id, 'confirm': token} response = session.get(URL, params=params, stream=True) save_response_content(response, destination) file_id = '0B7IzDz-4yH_HMFdiSE44R1lselE' path_to_tar_file = str(time.time()) + '.tar.gz' download_file_from_google_drive(file_id, path_to_tar_file) print('Extraction') with tarfile.open(path_to_tar_file) as tar_ref: tar_ref.extractall(os.path.dirname(img_folder)) os.remove(path_to_tar_file)# Also, copy our pre-processed annotations to the dataset folderpyfile('/content/small_test.json', os.path.join(img_folder, 'small_test.json'))copyfile('/content/small_train.json', os.path.join(img_folder, 'small_train.json'))5、将标签名字用向量表示

# We want to represent our label names as vectors in order to use them as features further.# To do that we decided to use GloVe model (https://nlp.stanford.edu/projects/glove/).# Let's download GloVe model trained on a Wikipedia Text Corpus.glove_zip_name = 'glove.6B.zip'glove_url = 'http://nlp.stanford.edu/data/glove.6B.zip'# For our purposes, we use a model where each word is encoded by a vector of length 300target_model_name = 'glove.6B.300d.txt'if not os.path.exists(target_model_name): with urllib.request.urlopen(glove_url) as dl_file: with open(glove_zip_name, 'wb') as out_file: out_file.write(dl_file.read()) # Extract zip archive. with zipfile.ZipFile(glove_zip_name) as zip_f: zip_f.extract(target_model_name) os.remove(glove_zip_name)6、加载glove模型

# Now load GloVe model.embeddings_dict = {}with open("glove.6B.300d.txt", 'r', encoding="utf-8") as f: for line in f: values = line.split() word = values[0] vector = np.asarray(values[1:], "float32") embeddings_dict[word] = vector6、计算目标标签子集中每个标签的GloVe嵌入。

# Calculate GloVe embeddings for each label in our target label subset.small_labels = ['house', 'birds', 'sun', 'valley', 'nighttime', 'boats', 'mountain', 'tree', 'snow', 'beach', 'vehicle', 'rocks', 'reflection', 'sunset', 'road', 'flowers', 'ocean', 'lake', 'window', 'plants', 'buildings', 'grass', 'water', 'animal', 'person', 'clouds', 'sky']vectorized_labels = [embeddings_dict[label].tolist() for label in small_labels]# Save them for further use.word_2_vec_path = 'word_2_vec_glow_classes.json'with open(word_2_vec_path, 'w') as fp: json.dump({ 'vect_labels': vectorized_labels, }, fp, indent=3)7、展示结果

%matplotlib inline# Let's check how well GloVe represents label names from our dataset.# It would be hard to visualize vectors with 300 values, but luckly we have t-SNE for that.# This function builds a t-SNE model(/d/file/gt/2023-09/a2gjwzvq3m3 # for label embeddings and visualizes them.def tsne_plot(tokens, labels): tsne_model = TSNE(perplexity=2, n_components=2, init='pca', n_iter=25000, random_state=2020, n_jobs=4) new_values = tsne_model_transform(tokens) x = [] y = [] for value in new_values: xend(value[0]) yend(value[1]) plt.figure(figsize=(13, 13)) for i in range(len(x)): pltatter(x[i], y[i]) plt.annotate(labels[i], xy=(x[i], y[i]), xytext=(5, 2), size=15, textcoords='offset points', ha='right', va='bottom') plt()

# Now we can draw t-SNE visualization.tsne_plot(vectorized_labels, small_labels)

8、定义加载数据的类

# The Dataset class for NUS-WIDE is the same as in our previous post. The only difference# is that we need to load vectorized representations of labels too.class NusDatasetGCN(Dataset): def __init__(self, data_path, anno_path, transforms, w2v_path): self.transforms = transforms with open(anno_path) as fp: json_data = json.load(fp) samples = json_data['samples'] self.classes = json_data['labels'] self.imgs = [] self.annos = [] self.data_path = data_path print('loading', anno_path) for sample in samples: self.imgsend(sample['image_name']) self.annosend(sample['image_labels']) for item_id in range(len(self.annos)): item = self.annos[item_id] vector = [cls in item for cls in self.classes] self.annos[item_id] = np.array(vector, dtype=float) # Load vectorized labels for GCN from json. with open(w2v_path) as fp: self.gcn_inp = np.array(json.load(fp)['vect_labels'], dtype=float) def __getitem__(self, item): anno = self.annos[item] img_path = os.path.join(self.data_path, self.imgs[item]) img = Image.open(img_path) if self.transforms is not None: img = self.transforms(img) return img, anno, self.gcn_inp def __len__(self): return len(self.imgs)9、加载数据并显示

# Let's take a look at the data we have. To do it we need to load the dataset without augmentations.dataset_val = NusDatasetGCN(img_folder, os.path.join(img_folder, 'small_test.json'), None, word_2_vec_path)dataset_train = NusDatasetGCN(img_folder, os.path.join(img_folder, 'small_train.json'), None, word_2_vec_path)# A function for visualization.def show_sample(img, binary_img_labels, _): # Convert the binary labels back to the text representation. img_labels = np.array(dataset_val.classes)[np.argwhere(binary_img_labels > 0)[:, 0]] plt.imshow(img) plt.title("{}".format(', '.join(img_labels))) plt.axis('off') plt()for sample_id in [13, 15, 22, 29, 57, 127]: show_sample(*dataset_val[sample_id])

部分结果:

loading images/small_test.jsonloading images/small_train.json

10、计算标签分布

# Calculate label distribution for the entire dataset (train + test).samples = dataset_val.annos + dataset_train.annossamples = np.array(samples)with printoptions(precision=3, suppress=True): class_counts = np.sum(samples, axis=0) # Sort labels according to their frequency in the dataset. sorted_ids = np.array([i[0] for i in sorted(enumerate(class_counts), key=lambda x: x[1])], dtype=int) print('Label distribution (count, class name):', list(zip(class_counts[sorted_ids].astype(int), np.array(dataset_val.classes)[sorted_ids]))) plth(range(len(dataset_val.classes)), width=class_counts[sorted_ids]) plt.yticks(range(len(dataset_val.classes)), np.array(dataset_val.classes)[sorted_ids]) plt.gca().margins(y=0) plt.grid() plt.title('Label distribution') plt()

Label distribution (count, class name): [(107, 'house'), (112, 'sun'), (114, 'birds'), (122, 'nighttime'), (128, 'valley'), (131, 'boats'), (157, 'mountain'), (157, 'tree'), (163, 'snow'), (167, 'beach'), (176, 'vehicle'), (188, 'rocks'), (237, 'reflection'), (266, 'sunset'), (286, 'road'), (290, 'flowers'), (389, 'ocean'), (395, 'lake'), (419, 'window'), (466, 'plants'), (518, 'buildings'), (661, 'grass'), (1065, 'water'), (1076, 'animal'), (1508, 'person'), (1709, 'clouds'), (2298, 'sky')]

11、计算邻接矩阵

# To proceed with the training we first need to compute adjacency matrix.adj_matrix_path = 'adjacency_matrix.json'# Count all labels.nums = np.sum(np.array(dataset_train.annos), axis=0)label_len = len(small_labels)adj = np.zeros((label_len, label_len), dtype=int)# Now iterate over the whole training set and consider all pairs of labels in sample annotation.for sample in dataset_train.annos: sample_idx = np.argwhere(sample > 0)[:, 0] # We count all possible pairs that can be created from each sample's set of labels. for i, j in itertoolsbinations(sample_idx, 2): adj[i, j] += 1 adj[j, i] += 1# Save it for further use. with open(adj_matrix_path, 'w') as fp: json.dump({ 'nums': nums.tolist(), 'adj': adj.tolist() }, fp, indent=3)12、定义图卷积网络

# We use implementation of GCN from github repository: # /d/file/gt/2023-09/aw1mvj4dxbx.py GraphConvolution(nn.Module): """ Simple GCN layer, similar to /d/file/gt/2023-09/qenk5ptpzwo.02907 """ def __init__(self, in_features, out_features, bias=False): super(GraphConvolution, self).__init__() self_features = in_features self.out_features = out_features self.weight = Parameter(torch.Tensor(in_features, out_features), requires_grad=True) if bias: self.bias = Parameter(torch.Tensor(1, 1, out_features), requires_grad=True) else: self.register_parameter('bias', None) self.reset_parameters() def reset_parameters(self): stdv = 1. / math.sqrt(self.weight.size(1)) self.weight.data.uniform_(-stdv, stdv) if self.bias is not None: self.bias.data.uniform_(-stdv, stdv) def forward(self, input, adj): support = torch.matmul(input.float(), self.weight.float()) output = torch.matmul(adj, support) if self.bias is not None: return output + self.bias else: return output def __repr__(self): return self.__class__.__name__ + ' (' \ + str(self_features) + ' -> ' \ + str(self.out_features) + ')'# Create adjacency matrix from statistics.def gen_A(num_classes, t, p, adj_data): adj = np.array(adj_data['adj']).astype(np.float32) nums = np.array(adj_data['nums']).astype(np.float32) nums = nums[:, np.newaxis] adj = adj / nums adj[adj < t] = 0 adj[adj >= t] = 1 adj = adj * p / (adj.sum(0, keepdims=True) + 1e-6) adj = adj + np.identity(num_classes, npt) return adj# Apply adjacency matrix re-normalization.def gen_adj(A): D = torch.pow(A.sum(1).float(), -0.5) D = torch.diag(D).type_as(A) adj = torch.matmul(torch.matmul(A, D).t(), D) return adjclass GCNResnext50(nn.Module): def __init__(self, n_classes, adj_path, in_channel=300, t=0.1, p=0.25): super().__init__() self.sigm = nn.Sigmoid() self.features = models.resnext50_32x4d(pretrained=True) self.features.fc = nn.Identity() self.num_classes = n_classes self.gc1 = GraphConvolution(in_channel, 1024) self.gc2 = GraphConvolution(1024, 2048) self.relu = nn.LeakyReLU(0.2) # Load data for adjacency matrix with open(adj_path) as fp: adj_data = json.load(fp) # Compute adjacency matrix adj = gen_A(n_classes, t, p, adj_data) self.A = Parameter(torch.from_numpy(adj).float(), requires_grad=False) def forward(self, imgs, inp): # Get visual features from image feature = self.features(imgs) feature = feature.view(feature.size(0), -1) # Get graph features from graph inp = inp[0].squeeze() adj = gen_adj(self.A).detach() x = self.gc1(inp, adj) x = self.relu(x) x = self.gc2(x, adj) # We multiply the features from GСN and СNN in order to take into account # the contribution to the prediction of classes from both the image and the graph. x = x.transpose(0, 1) x = torch.matmul(feature, x) return self.sigm(x)12、定义评价指标

# Use threshold to define predicted labels and invoke sklearn's metrics with different averaging strategies.def calculate_metrics(pred, target, threshold=0.5): pred = np.array(pred > threshold, dtype=float) return {'micro/precision': precision_score(y_true=target, y_pred=pred, average='micro'), 'micro/recall': recall_score(y_true=target, y_pred=pred, average='micro'), 'micro/f1': f1_score(y_true=target, y_pred=pred, average='micro'), 'macro/precision': precision_score(y_true=target, y_pred=pred, average='macro'), 'macro/recall': recall_score(y_true=target, y_pred=pred, average='macro'), 'macro/f1': f1_score(y_true=target, y_pred=pred, average='macro'), 'samples/precision': precision_score(y_true=target, y_pred=pred, average='samples'), 'samples/recall': recall_score(y_true=target, y_pred=pred, average='samples'), 'samples/f1': f1_score(y_true=target, y_pred=pred, average='samples'), }13、初始化参数以及可视化设定

# Initialize the training parameters.num_workers = 8 # Number of CPU processes for data preprocessinglr = 5e-6 # Learning ratebatch_size = 32save_freq = 1 # Save checkpoint frequency (epochs)test_freq = 200 # Test model frequency (iterations)max_epoch_number = 35 # Number of epochs for training # Note: on the small subset of data overfitting happens after 30-35 epochsan = [0.485, 0.456, 0.406]std = [0.229, 0.224, 0.225]device = torchice('cuda')# Save path for checkpoints.save_path = 'chekpoints/'# Save path for logs.logdir = 'logs/'# Run tensorboard.%load_ext tensorboard%tensorboard --logdir {logdir}14、设置检查点

# Here is an auxiliary function for checkpoint saving.def checkpoint_save(model, save_path, epoch): f = os.path.join(save_path, 'checkpoint-{:06d}.pth'.format(epoch)) if 'module' in dir(model): torch.save(model.module.state_dict(), f) else: torch.save(model.state_dict(), f) print('saved checkpoint:', f)15、数据预处理

# Test preprocessing.val_transform = transforms.Compose([ transforms.Resize((256, 256)), transforms.ToTensor(), transforms.Normalize(mean, std)])# Train preprocessing.train_transform = transforms.Compose([ transforms.Resize((256, 256)), transforms.RandomHorizontalFlip(), transforms.ColorJitter(), transforms.RandomAffine(degrees=20, translate=(0.2, 0.2), scale=(0.5, 1.5), shear=None, resample=False, fillcolor=tuple(np.array(np.array(mean) * 255).astype(int).tolist())), transforms.ToTensor(), transforms.Normalize(mean, std)])16、定义训练相关参数

# Initialize the dataloaders for training.test_annotations = os.path.join(img_folder, 'small_test.json')train_annotations = os.path.join(img_folder, 'small_train.json')test_dataset = NusDatasetGCN(img_folder, test_annotations, val_transform, word_2_vec_path)train_dataset = NusDatasetGCN(img_folder, train_annotations, train_transform, word_2_vec_path)train_dataloader = DataLoader(train_dataset, batch_size=batch_size, num_workers=num_workers, shuffle=True, drop_last=True)test_dataloader = DataLoader(test_dataset, batch_size=batch_size, num_workers=num_workers)num_train_batches = int(np.ceil(len(train_dataset) / batch_size))# Initialize the model.model = GCNResnext50(len(train_dataset.classes), adj_matrix_path)# Switch model to the training mode and move it to GPU.model.train()model = model.to(device)optimizer = torch.optim.Adam(model.parameters(), lr=lr)# If more than one GPU is available we can use both to speed up the training.if torch.cudaice_count() > 1: model = nn.DataParallel(model)os.makedirs(save_path, exist_ok=True)# Loss function.criterion = nn.BCELoss()# Tensoboard logger.logger = SummaryWriter(logdir)

loading images/small_test.jsonloading images/small_train.json

Downloading: "<a href="https://download.pytorch/models/resnext50_32x4d-7cdf4587.pth" rel="nofollow" target="_blank">https://download.pytorch/models/resnext50_32x4d-7cdf4587.pth</a>" to /root/.cache/torch/checkpoints/resnext50_32x4d-7cdf4587.pth

100%

95.8M/95.8M [00:11<00:00, 8.74MB/s]

17、开始训练

# Run training.epoch = 0iteration = 0while True: batch_losses = [] for batch_number, (imgs, targets, gcn_input) in enumerate(train_dataloader): imgs, targets, gcn_input = imgs.to(device), targets.to(device), gcn_input.to(device) optimizer.zero_grad() model_result = model(imgs, gcn_input) loss = criterion(model_result, targets.type(torch.float)) batch_loss_value = loss.item() loss.backward() torch.nn.utils.clip_grad_norm(model.parameters(), 10.0) optimizer.step() logger.add_scalar('train_loss', batch_loss_value, iteration) batch_lossesend(batch_loss_value) with torch.no_grad(): result = calculate_metrics(model_result.cpu().numpy(), targets.cpu().numpy()) for metric in result: logger.add_scalar('train/' + metric, result[metric], iteration) if iteration % test_freq == 0: model.eval() with torch.no_grad(): model_result = [] targets = [] for imgs, batch_targets, gcn_input in test_dataloader: gcn_input = gcn_input.to(device) imgs = imgs.to(device) model_batch_result = model(imgs, gcn_input) model_result.extend(model_batch_result.cpu().numpy()) targets.extend(batch_targets.cpu().numpy()) result = calculate_metrics(np.array(model_result), np.array(targets)) for metric in result: logger.add_scalar('test/' + metric, result[metric], iteration) print("epoch:{:2d} iter:{:3d} test: " "micro f1: {:.3f} " "macro f1: {:.3f} " "samples f1: {:.3f}".format(epoch, iteration, result['micro/f1'], result['macro/f1'], result['samples/f1'])) model.train() iteration += 1 loss_value = npan(batch_losses) print("epoch:{:2d} iter:{:3d} train: loss:{:.3f}".format(epoch, iteration, loss_value)) if epoch % save_freq == 0: checkpoint_save(model, save_path, epoch) epoch += 1 if max_epoch_number < epoch: break

结果:

/usr/local/lib/python3.6/dist-packages/ipykernel_launcher.py:15: UserWarning: torch.nn.utils.clip_grad_norm is now deprecated in favor of torch.nn.utils.clip_grad_norm_. from ipykernel import kernelapp as app/usr/local/lib/python3.6/dist-packages/sklearn/metrics/_classification.py:1272: UndefinedMetricWarning: Recall is ill-defined and being set to 0.0 in labels with no true samples. Use `zero_division` parameter to control this behavior. _warn_prf(average, modifier, msg_start, len(result))/usr/local/lib/python3.6/dist-packages/sklearn/metrics/_classification.py:1272: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 in samples with no predicted labels. Use `zero_division` parameter to control this behavior. _warn_prf(average, modifier, msg_start, len(result))epoch: 0 iter: 0 test: micro f1: 0.131 macro f1: 0.124 samples f1: 0.121/usr/local/lib/python3.6/dist-packages/sklearn/metrics/_classification.py:1272: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior. _warn_prf(average, modifier, msg_start, len(result))/usr/local/lib/python3.6/dist-packages/sklearn/metrics/_classification.py:1515: UndefinedMetricWarning: F-score is ill-defined and being set to 0.0 in labels with no true nor predicted samples. Use `zero_division` parameter to control this behavior. average, "true nor predicted", 'F-score is', len(true_sum)/usr/local/lib/python3.6/dist-packages/sklearn/metrics/_classification.py:1272: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 due to no predicted samples. Use `zero_division` parameter to control this behavior. _warn_prf(average, modifier, msg_start, len(result))epoch: 0 iter:156 train: loss:0.273saved checkpoint: chekpoints/checkpoint-000000.pthepoch: 1 iter:200 test: micro f1: 0.478 macro f1: 0.140 samples f1: 0.421epoch: 1 iter:312 train: loss:0.170saved checkpoint: chekpoints/checkpoint-000001.pthepoch: 2 iter:400 test: micro f1: 0.594 macro f1: 0.225 samples f1: 0.564epoch: 2 iter:468 train: loss:0.150saved checkpoint: chekpoints/checkpoint-000002.pthepoch: 3 iter:600 test: micro f1: 0.630 macro f1: 0.272 samples f1: 0.605epoch: 3 iter:624 train: loss:0.139saved checkpoint: chekpoints/checkpoint-000003.pthepoch: 4 iter:780 train: loss:0.131saved checkpoint: chekpoints/checkpoint-000004.pthepoch: 5 iter:800 test: micro f1: 0.678 macro f1: 0.386 samples f1: 0.654epoch: 5 iter:936 train: loss:0.125saved checkpoint: chekpoints/checkpoint-000005.pthepoch: 6 iter:1000 test: micro f1: 0.679 macro f1: 0.413 samples f1: 0.650epoch: 6 iter:1092 train: loss:0.120saved checkpoint: chekpoints/checkpoint-000006.pthepoch: 7 iter:1200 test: micro f1: 0.688 macro f1: 0.446 samples f1: 0.655epoch: 7 iter:1248 train: loss:0.116saved checkpoint: chekpoints/checkpoint-000007.pthepoch: 8 iter:1400 test: micro f1: 0.703 macro f1: 0.491 samples f1: 0.678epoch: 8 iter:1404 train: loss:0.112saved checkpoint: chekpoints/checkpoint-000008.pthepoch: 9 iter:1560 train: loss:0.109saved checkpoint: chekpoints/checkpoint-000009.pthepoch:10 iter:1600 test: micro f1: 0.697 macro f1: 0.485 samples f1: 0.669epoch:10 iter:1716 train: loss:0.107saved checkpoint: chekpoints/checkpoint-000010.pthepoch:11 iter:1800 test: micro f1: 0.714 macro f1: 0.546 samples f1: 0.693epoch:11 iter:1872 train: loss:0.103saved checkpoint: chekpoints/checkpoint-000011.pthepoch:12 iter:2000 test: micro f1: 0.705 macro f1: 0.526 samples f1: 0.678epoch:12 iter:2028 train: loss:0.101saved checkpoint: chekpoints/checkpoint-000012.pthepoch:13 iter:2184 train: loss:0.098saved checkpoint: chekpoints/checkpoint-000013.pthepoch:14 iter:2200 test: micro f1: 0.700 macro f1: 0.523 samples f1: 0.674epoch:14 iter:2340 train: loss:0.096saved checkpoint: chekpoints/checkpoint-000014.pthepoch:15 iter:2400 test: micro f1: 0.711 macro f1: 0.541 samples f1: 0.689epoch:15 iter:2496 train: loss:0.093saved checkpoint: chekpoints/checkpoint-000015.pthepoch:16 iter:2600 test: micro f1: 0.706 macro f1: 0.532 samples f1: 0.681epoch:16 iter:2652 train: loss:0.091saved checkpoint: chekpoints/checkpoint-000016.pthepoch:17 iter:2800 test: micro f1: 0.715 macro f1: 0.559 samples f1: 0.692epoch:17 iter:2808 train: loss:0.089saved checkpoint: chekpoints/checkpoint-000017.pthepoch:18 iter:2964 train: loss:0.086saved checkpoint: chekpoints/checkpoint-000018.pthepoch:19 iter:3000 test: micro f1: 0.710 macro f1: 0.545 samples f1: 0.686epoch:19 iter:3120 train: loss:0.084saved checkpoint: chekpoints/checkpoint-000019.pthepoch:20 iter:3200 test: micro f1: 0.712 macro f1: 0.553 samples f1: 0.682epoch:20 iter:3276 train: loss:0.082saved checkpoint: chekpoints/checkpoint-000020.pthepoch:21 iter:3400 test: micro f1: 0.711 macro f1: 0.553 samples f1: 0.686epoch:21 iter:3432 train: loss:0.080saved checkpoint: chekpoints/checkpoint-000021.pthepoch:22 iter:3588 train: loss:0.078saved checkpoint: chekpoints/checkpoint-000022.pthepoch:23 iter:3600 test: micro f1: 0.712 macro f1: 0.556 samples f1: 0.689epoch:23 iter:3744 train: loss:0.077saved checkpoint: chekpoints/checkpoint-000023.pthepoch:24 iter:3800 test: micro f1: 0.708 macro f1: 0.553 samples f1: 0.682epoch:24 iter:3900 train: loss:0.074saved checkpoint: chekpoints/checkpoint-000024.pthepoch:25 iter:4000 test: micro f1: 0.714 macro f1: 0.561 samples f1: 0.691epoch:25 iter:4056 train: loss:0.072saved checkpoint: chekpoints/checkpoint-000025.pthepoch:26 iter:4200 test: micro f1: 0.713 macro f1: 0.564 samples f1: 0.689epoch:26 iter:4212 train: loss:0.070saved checkpoint: chekpoints/checkpoint-000026.pthepoch:27 iter:4368 train: loss:0.069saved checkpoint: chekpoints/checkpoint-000027.pthepoch:28 iter:4400 test: micro f1: 0.709 macro f1: 0.555 samples f1: 0.687epoch:28 iter:4524 train: loss:0.066saved checkpoint: chekpoints/checkpoint-000028.pthepoch:29 iter:4600 test: micro f1: 0.711 macro f1: 0.559 samples f1: 0.689epoch:29 iter:4680 train: loss:0.064saved checkpoint: chekpoints/checkpoint-000029.pthepoch:30 iter:4800 test: micro f1: 0.714 macro f1: 0.579 samples f1: 0.698epoch:30 iter:4836 train: loss:0.063saved checkpoint: chekpoints/checkpoint-000030.pthepoch:31 iter:4992 train: loss:0.061saved checkpoint: chekpoints/checkpoint-000031.pthepoch:32 iter:5000 test: micro f1: 0.707 macro f1: 0.564 samples f1: 0.681epoch:32 iter:5148 train: loss:0.059saved checkpoint: chekpoints/checkpoint-000032.pthepoch:33 iter:5200 test: micro f1: 0.699 macro f1: 0.556 samples f1: 0.679epoch:33 iter:5304 train: loss:0.058saved checkpoint: chekpoints/checkpoint-000033.pthepoch:34 iter:5400 test: micro f1: 0.706 macro f1: 0.565 samples f1: 0.685epoch:34 iter:5460 train: loss:0.055saved checkpoint: chekpoints/checkpoint-000034.pthepoch:35 iter:5600 test: micro f1: 0.706 macro f1: 0.564 samples f1: 0.686epoch:35 iter:5616 train: loss:0.055saved checkpoint: chekpoints/checkpoint-000035.pth

最后是进行测试:

# Run inference on the test data.model.eval()for sample_id in [1, 2, 3, 4, 6]: test_img, test_labels, gcn_input = test_dataset[sample_id] test_img_path = os.path.join(img_folder, test_dataset.imgs[sample_id]) with torch.no_grad(): raw_pred = model(test_img.unsqueeze(0).cuda(), torch.from_numpy(gcn_input).unsqueeze(0).cuda()).cpu().numpy()[0] raw_pred = np.array(raw_pred > 0.5, dtype=float) predicted_labels = np.array(dataset_val.classes)[np.argwhere(raw_pred > 0)[:, 0]] if not len(predicted_labels): predicted_labels = ['no predictions'] img_labels = np.array(dataset_val.classes)[np.argwhere(test_labels > 0)[:, 0]] plt.imshow(Image.open(test_img_path)) plt.title("Predicted labels: {} \nGT labels: {}".format(', '.join(predicted_labels), ', '.join(img_labels))) plt.axis('off') plt()

最后是目录结构:

参考:https://www.learnopencv/graph-convolutional-networks-model-relations-in-data/

发现里有个肿块,什么情况?

菠萝说

今年菠萝联合肿瘤知道,精心制作了一套新的科普文:《她说(HER):菠萝解密乳腺癌》。在图文之外,还会配有菠萝的独家“四川普通话”音频。大家可以在蜻蜓FM上关注“菠萝因子”,同步收听每期推送的音频节目。

除此之外,每期文末的小测试和赠书活动依旧,欢迎大家踊跃参加。上一期的获奖读者是曾伟和茹,恭喜二位。

今天第十二期,我们来聊聊纤维腺瘤。

文| 菠萝

洗澡的时候突然摸到一个肿块!女孩懵了,天哪,难道中招了么?

第二天,赶快到医院去检查,医生说:“还好,是乳腺纤维腺瘤。”

乳腺纤维腺瘤?是癌症么?会恶化么?会影响生活么?相信这是每一位被查出来的女性都特别关心的问题。

在上摸到肿块肯定是很吓人的经历,但幸运的是,并不是每一个肿块都是恶性的,也并不都需要复杂的治疗。乳腺纤维腺瘤,就是一个良性,很容易治疗的“小问题”。

纤维腺瘤,英文名是Adenofibroma,是一种由腺体和纤维组织增生而形成的良性肿瘤。它不仅会出现在乳腺,还可能会出现在子宫,卵巢,肺部等地方。

乳腺的纤维腺瘤是乳腺最常见的良性肿瘤,理论上青春期后的女性都有可能,但统计上来看,通常是发生在30岁以下的女孩。

纤维腺瘤到底摸起来啥样呢?首先,有些纤维腺瘤特别小,根本摸不到,只能靠影像学检查(超声或者X光)才会被发现。

长大的纤维腺瘤能摸到,特点也很鲜明,那就是和周围组织感觉区别特别明显,有非常明确的边缘和形状。如果你去挤压,会发现它可以整体在皮肤下移动,滑来滑去。另外,这种包块除了摸着有感觉以外,通常并没有任何显著的症状,不痛,也没有溢液,这些和恶性的乳腺癌是有明显的区别的。

容易和纤维腺瘤混淆的是乳腺增生(乳腺结节)。区分它俩有个比较实用的办法,那就是看肿块是否随着经期而变化。

如果经期前后肿块大小明显变化,尤其是经期前变大,那么这个肿块是乳腺增生的概率很大;但如果这个肿块无论什么时候,大小都没有明显变化,那它就更可能是一个纤维腺瘤。

当然,要明确它们的性质,还是得靠黄金标准:病理检查。通过穿刺获取一些组织样本,然后请专业得病理科医生在显微镜下来判断它到底是什么。

纤维腺瘤到底是什么引起的呢?

确切的原因目前尚不清楚。一个重要的影响原因是激素,尤其是雌激素。如果雌激素水平失调,可能会直接影响纤维腺瘤的生长。同时,有研究发现,在20岁之前长期使用口服避孕药,会增加纤维腺瘤发病几率。

如果完全不管,纤维腺瘤大小有可能会变化,比如怀孕期间它可能会长大,而到了更年期,又经常会萎缩。有些时候,纤维腺瘤甚至会自己消失。

由于我们现在怀疑纤维腺瘤和激素有关,所以含雌激素的补品或刺激方法应该要避免。比如,有些人企图用精油按摩的办法来消除纤维腺瘤。

这是明显的不讲科学瞎搞。

纤维腺瘤不是堵奶,它是细胞增生的产物,又不是啥管子堵住了,光靠按摩怎么可能消失呢?关键很多精油里面还含有高浓度的雌激素,可能让人皮肤变好,感觉更年轻,但同时弄不好会刺激纤维腺瘤,让肿块变得更大。

所以,没搞明白科学的时候,千万别靠直觉来瞎弄。

还有些人认为纤维腺瘤和一些带刺激性的饮料,比如茶、咖啡,碳酸饮料等有关系,所以推荐少喝来改善纤维腺瘤症状。虽然这方面的故事和个例都有不少,但据我所知,目前还没有严格的对照试验能证明喝这些饮料和纤维腺瘤有关。

当然,由于这些饮料都不是生活必须的,而且碳酸饮料肯定是喝得越少越好,所以如果大家觉得少喝比较好,也完全没有问题。

大家关心最重要的一个问题,还是纤维腺瘤到底会不会恶化?会不会增加乳腺癌的发病率?

早年研究发现纤维腺瘤患者得乳腺癌的风险有增加,但后来更多试验都无法重复这些结论。目前专家普遍认为,乳腺纤维瘤和乳腺癌之间的直接关联非常弱,它直接癌变的可能非常低,几乎可以忽略。

总之,如果只是有纤维腺瘤,并不增加乳腺癌的风险。

稍微展开一点来讲的话,根据病理形态,纤维腺瘤可以分为两类,简单纤维腺瘤和复杂纤维腺瘤。简单纤维腺瘤在显微镜下看起来形态都一样,很统一,而复杂纤维腺瘤结构比较多样,含有其它成分,比如囊胞,钙化点等。

其中,简单纤维腺瘤是肯定不增加乳腺癌发病风险的。而复杂纤维腺瘤也只是从统计上略微增加一点风险。即使发现有复杂纤维腺瘤,也注意每年体检和复查就好,不需要特别担心。

比较值得留意的情况,是如果有单个特别大的肿块(有些能长大十几厘米!)。这个时候,要注意发展成低恶性的分叶状肿瘤的可能性。但即使如此,整体治疗效果依然很好,只是稍微复杂一些。

网上有很多关于纤维腺瘤癌变的传言,其实都是夸大,甚至是欺骗性的宣传。目的嘛,就是有些骗子医院或诊所为了吸引不明真相的患者,去他们那里接受所谓的防癌根治。在正规医院很便宜就搞定的事情,去哪些地方可能就会成为天价。可能还会被忽悠,买各种各样完全无效的防复发保健品。

纤维腺瘤怎么治?

如果被诊断纤维腺瘤,手术是最彻底有效的治疗方式,而且它的手术是一个特别简单的手术,风险极小。

但是,大家不一定必须要做手术,也可以选择保守观察。事实上,如果没有症状,肿瘤个头又不大,医生很可能会推荐观察。

具体怎么选择,取决于很多因素,包括患者症状,家庭病史和个人心态。

如果出现下面这些情况之一,通常会选择手术切除纤维腺瘤:

· 如果影响了的形状。

· 如果引起了疼痛。

· 如果患者特别担心它发展成癌症。

· 如果患者有乳腺癌家族史。

· 如果活检结果提示有恶性的风险。

绝大多数纤维腺瘤切除后不会复发,但部分年轻患者可能会在手术附近,或者其他地方长出新的纤维瘤。

在偶然的情况下,纤维腺瘤的患者会是未成年的小孩。这种情况下,治疗的整体逻辑依然是一样的,但是手术与否的决定会更加的保守。

总而言之吧,纤维腺瘤是一种年轻女性中很常见的情况,而且几乎没有恶化的风险,大家不用特别担心。一旦确诊,请到正规医院按规范治疗,无论是观察还是手术,都是可以的选择。

真正的危险,就是有人迷信网上的“神医”,掉入陷阱,那结果就很难讲了。

参考文献:

1.Long-Term Risk of Breast Cancer in Womenwith Fibroadenoma. N Engl J Med. 1994 Jul 7;331(1):10-5.

2.A prospective study of the development ofbreast cancer in 16,692 women with a benign tumor in the breast. Am J Epidemiol1988;128:467-477

3.Incidence of breast cancer in women withfibroadenoma. Int J Cancer 1994 Jun 1;57(5):681-3

4.No elevation in long-term breast carcinomarisk for women with fibroadenomas that contain atypical hyperplasia. Cancer2001 Jul 1;92(1):30-6

追更有礼

每期文末,菠萝都会出一道关于乳腺癌知识的测试题,作为下一期内容的预告,也会在下一期公布答案。我们将随机选出评论区留言回答正确的两位读者,赠予菠萝科普书一本。

测试题#12:

问题:下面哪一个,不属于乳腺癌常见药物?

A:埃克替尼

B:紫杉醇

C:他莫昔芬

D:曲妥珠单抗

上期答案公布

(点击这里,回顾上一期精彩内容)

答案:B , 20岁大学校花乳腺纤维瘤的风险最高。

解析:乳腺的纤维腺瘤是乳腺最常见的良性肿瘤,理论上青春期后的女性都有可能,但统计上来看,通常是发生在30岁以下的女孩。

本文首发在公众号“粉菠萝”

专注于女性健康

▼长按下方二维码点击关注▼

热门推荐