浅谈Softmax与Cross Entropy Loss
在机器学习的多分类任务中,经常听到这么两个名词:Softmax与交叉熵损失函数(Cross Entropy Loss),另外还有一个Sigmoid函数也经常出现,那么这几个东西究竟有什么联系呢?
Softmax这里先顺便提一句Sigmoid,它与Softmax也有一点关系。我最先听说Sigmoid函数是在逻辑斯蒂回归模型中,这是个二分类任务中常用的经典模型。Sigmoid函数长这样:
\sigma(z)=\frac{1}{1+e^{-z}}它将实数域$\mathbb{R}$映射为(0,1)区间,特殊地将0映射为0.5,那么我们在逻辑斯蒂回归中使用的决策方法就是计算一下$\sigma(\mathbf{\omega}^T\mathbf{x}+b)$的值,从而得到$\mathbf{x}$属于正类的概率值,进而进行预测判断。
而Softmax则是下面这样一个多元向量值函数:
a_i=\frac{e^{z_i}}{\sum_{j=1}^Ne^{z_j}},\quad i=1,2,\dots,N显然,一定有$\sum_{i=1}^Na_i=1$。在N分类任务中,常使用这个函数作为神经网络最末层的激 ...
Webpack配置Vue项目文件的读取解析规则
Vue项目中使用webpack对文件进行打包时,由于.vue文件的特殊性,webpack一般无法正常对这类文件进行解析,我们可以通过以下方法对webpack进行配置:
打开webpack.config.js文件,在module.exports中加上以下内容:
module: {
rules: [
{
test: /.css$/,
use: [ 'css-loader', 'style-loader' ]
},
{
test: /.vue$/,
use: [ 'vue-loader' ]
}
]
},
当然仅仅这样添加是没有用的,我们还需要安装css-loader、style-loader、vue-loader与vue-template-compiler:
npm install css-loader style-loader vue-loader vue-template-compiler --save-dev
安装完以后运行webpack ...
如何应用Webpack来运行Vue项目
Vue有多种导入方式,最常见的非模块化导入就是直接往网页里插入一个诸如这样的script标签:<script src="https://fastly.jsdelivr.net/npm/vue/dist/vue.js"></script>
但现在项目中一般看不见这种使用方法了,而大多使用模块化的导入方式。
但这些模块化导入命令的语法非浏览器所认可,直接在JS代码中使用会报错,而Webpack的作用简单而言就是将浏览器看不懂的代码转化为浏览器看得懂的代码。
简单创建一个web项目首先创建一个web项目的文件夹(不妨命名为web),在其下创建一个index.html作为web项目的入口文件,再创建两个文件夹:src与dist,其中src用于存放开发过程中的源码,而dist用于存放项目发布时的代码。进入src文件夹,随意创建一个index.js作为JS入口文件。
以下所有操作都在web文件夹下进行。
初始化npm依赖于Node.js环境
npm init
该命令会在当前路径生成一个package.json
安装Webpack全局安装:
npm ins ...
npm源修改
在使用npm安装项目时,默认源在国外,导致速度贼慢甚至安装失败,这时可以通过以下命令修改源:
临时修改永久修改npm --registry https://registry.npm.taobao.org install xxxnpm config set registry https://registry.npm.taobao.org
通过以下命令查看是否修改成功:
npm config get registry
LaTeX章节编号样式自定义
在使用Latex写文章时,经常不满足于默认的章节编号样式,故有自定义编号样式的需求,例如需要改成中文的编号等等。本文总结了一些常见编号样式的修改方法。
%section
%修改编号为数字
\renewcommand\thesection{\arabic{section}}
%修改编号为小写字母
\renewcommand\thesection{\alph{section}}
%修改编号为大写字母
\renewcommand\thesection{\Alph{section}}
%修改编号为中文数字(需要导入ctex宏包)
\renewcommand\thesection{\chinese{section}}
其他诸如subsection之类的同理操作即可。
WordPress接入支付宝登录
搞了半天才发现微信开放平台不让个人号申请接入,因此我转战阿里系平台,花了一天时间接入了支付宝用户oauth接口。
支付宝开放平台的文档写的很详细,但仍有一些细节不到位,若开发者没什么基础,接入会比较困难。
其实支付宝开放平台提供了许多已经写好的SDK,但这SDK文档不详细,我懒得学,因此我自己写了一个脚本用以接入支付宝oauth。
代码见此gist,其中包含两个文件:RSA2.php与alipay.php。
接入方法如下:
首先在支付宝开放平台申请一个网页应用,(选择自研服务->网页&移动应用),申请成功后会获取一个APPID,将这个APPID填入alipay.php文件开头的define('Ali_APPID','');当中。
支付宝接口的安全性体现在其每次发起请求必须附带一个签名(sign),验签通过即确保参数未被篡改,接下来我将粗略讲一下这个签名是怎么生成的。
首先在支付宝开放平台进入你的应用,选择应用信息,在开发信息栏目中可以看到一行“接口加签方式”,点击进入。
作为普通开发者,这里选择加签模式为“公钥”,加签模式为“SHA256w ...
PHP的openssl模块怎么开启
昨天在本地跑PHP代码时,遇到一句报错,相信不少朋友们也遇到过:
PHP Fatal error: Uncaught Error: Call to undefined function openssl_sign()
要使用这个函数必须在PHP中开启openssl模块,很多网上的博客大多会提到这样一种方法:在php.ini文件中增加一句extension=php_openssl.dll。
加了这句代码后,运行时仍报了一个warning:
PHP Warning: PHP Startup: Unable to load dynamic library 'php_openssl.dll'
后来研究发现在php.ini中有一行代码描述了PHP扩展所在路径:extension_dir = "${phphome}\ext",而变量${phphome}在我这儿并没有定义,这一点很多其他博客并没有提到,这应该是一个环境变量,不过我之前没有设置过,因此我在前面加了一句:phphome='e:\php-7.3.22',为我的PHP安装目录,问题解决。 ...
WordPress接入微博登录
现在不少WordPress站点都接入了第三方登录,第三方登录不仅安全性高,还降低了注册成本、提高了注册效率,有助于吸引更多用户。
微博作为中国最大的网络平台之一,有着庞大的用户人群,本文将提供WP网站接入微博登录的方法。
首先源代码来源于此仓库:
引用站外地址,不保证站点的可用性和安全性
wp-oauth
GitHub
这位大佬还提供了很多其他平台的第三方接入教程。由于这位大佬写的不是很详细,因此我在这给出一个菜鸟教程,同时在代码中补充了CSRF验证,其他方面也有少量修改。
经过我修改后的微博登录代码可以从这个gist拿。
第一步,请确保你拥有一个微博开放平台审核通过的网站应用,将其App Key与App Secret复制到文件开头的代码中:
define('WB_APPID','your_appkey');//appkey
define('WB_APPSECRET','your_ap ...
WordPress记录、显示文章阅读次数
在使用WP建站时,我们可能会需要知道文章的受欢迎程度,其可以体现于其他人阅读文章的次数。今天我就提供一种简单的用以给文章浏览量进行计数的功能。
思路是在head部分加载的过程中执行一个计数+1的动作,将计数存入数据库的wp_postmeta表。在需要时将表中对应数据读出来即可。
将以下代码加入functions.php:
function post_views(){
global $post;
$post_ID = $post->ID;
$views = (int)get_post_meta($post_ID, 'visitors', true);
return '阅读(' .$views .')';
}
function record_visitors()
{
$currentUser = wp_get_current_user();
if(empty($currentUser->roles) || !in_array('administrator', $currentUser->roles))
if (is_single() ...
WordPress小工具标签云参数自定义
WP小工具有一个自带的标签云功能,可以为访客提供站点常用的关键词列表,便于访客在站内进行搜索。
标签云的生成函数wp_tag_cloud位于/wp-includes/category-template.php文件中,提供的参数数组如下:
$defaults = array(
'smallest' => 8,
'largest' => 22,
'unit' => 'pt',
'number' => 45,
'format' => 'flat',
'separator' => "\n",
'orderby' => 'count',
'order' => 'DESC',
'exclude' => '',
'include' => '',
'link' => 'view',
'taxonomy' => 'post_tag',
'post_type' => '',
'echo' => true,
'show_count' => 0,
); ...
在网页底部添加动态运行时间
很多人都在各种博客网站底部看到过动态变化的运行时间,比如“本站点已运行100天21小时56分17秒”,那么要想添加这样一行内容其实非常简单,只要用到基础的JS。
在网站底部添加以下代码即可:
<span id="runtime"></span>
<script>function show_runtime(){window.setTimeout("show_runtime()",1000);X=new Date("6/29/2020 18:14:10");Y=new Date();T=(Y.getTime()-X.getTime());M=24*60*60*1000;a=T/M;A=Math.floor(a);b=(a-A)*24;B=Math.floor(b);c=(b-B)*60;C=Math.floor((b-B)*60);D=Math.floor((c-C)*60);runtime.innerHTML="运行时间:"+A+"天"+B+"小时"+C+"分"+D+"秒"}show_runtime();</script>
WordPress不支持中文用户名注册的解决方法
WP默认是不支持中文用户名的,但身为中国人这岂能忍,本文带给大家一种方法,让WP支持中文用户名注册。
WP对注册用户名的限制写在/wp-includes/formatting.php文件中,对应函数是sanitize_user,其中限制中文的原因来自下面代码:
if ( $strict ) {
$username = preg_replace( '|[^a-z0-9 _.\-@]|i', '', $username );
}
在$strict=true时该语句将所有的非ASCII字符全过滤掉了。解决方法如下:
在functions.php文件中加入以下回调函数进行过滤:
// 支持中文用户名注册
function zh_sanitize_user ($username, $raw_username, $strict) {
$username = wp_strip_all_tags( $raw_username );
$username = remove_accents( $username );
$username = preg_repl ...
Windows系统修复图标显示问题
相信不少人都遇到过软件图标突然显示不了的问题,对于这种奇葩情况,我们可以用下面方法进行修复:
新建一个文本文档,内容是以下代码:
taskkill /f /im explorer.exe
attrib -h -i %userprofile%\AppData\Local\IconCache.db
del %userprofile%\AppData\Local\IconCache.db /a
start explorer
保存为.bat文件,双击运行即可解决问题。
服务器SSH配置出错导致无法连接问题的解决
有时候在操作服务器的过程中,一不小心(或有意)动了SSH的配置文件,导致其崩溃,关闭连接后无法再一次连接。就这个问题,本文从我个人的经验来写一些解决方法。
傻瓜式方法,一般提供服务器的厂商都会提供一键重装系统的功能,如果没什么重要数据,重装系统可以解决100%的问题。
如果有备份,也可以直接恢复备份。
提供服务器的厂商一般会提供紧急救援连接,比如阿里云,我们可以通过救援连接登录服务器,然后修改配置文件,若不会修改配置文件或是因为其他配置问题导致的崩溃,直接重装SSH也是可以的,以下是操作过程:
sudo apt-get remove openssh-server openssh-client --purge -y
sudo apt-get autoremove
sudo apt-get autoclean
sudo apt-get install openssh-server openssh-client
安装完成以后,简单修改一下配置文件:
sudo vi /etc/ssh/sshd_config
添加root密码登录的配置:
PermitRootLogin yes
Passw ...
一句命令部署WordPress
写了许多WordPress相关的文章,但迟迟没有写部署的方法,目前比较简单的部署方法有宝塔面板一键部署或直接使用WordPress应用镜像。
而考虑到宝塔面板需要额外预留大约0.5G内存且最近刚出来一个非常严重的数据库安全漏洞(无法预知以后还会不会有);直接装WordPress应用镜像过于无脑。因此我在这里介绍一条被很多人忽略的部署方法——使用docker。
关于docker软件的安装及容器的部署过程,我已经在ShareLaTeX部署中提过一次了,这里不再做特别详细的介绍。
WordPress容器的配置文件可以参考下面内容,并根据需求自行修改配置文件:
version: '3.1'
services:
WordPress:
image: WordPress
restart: always
ports:
- 80:80
environment:
WordPress_DB_HOST: db
WordPress_DB_USER: root
...
WordPress主题二次开发——子主题
在WP开发过程中,直接修改主题文件对主题进行美化是不妥的,因为若主题升级,一切又得重来,而子主题可以完美解决这一问题。子主题是指一个继承了另一个主题——父主题全部功能样式的主题,同时它允许你自己添加一些功能与样式。
创建一个子主题比较容易:
首先进入themes文件夹,该文件夹下放置了你全部的主题,找一个你希望继承的父主题文件夹,这里假设名为theme-parent,接下来创建子主题只需要两个步骤:
在themes文件夹下创建一个新文件夹,命名为theme-child(表示子主题的文件夹名,可任意命名)
进入子主题文件夹,创建一个文件:style.css,内容如下:
/*!
Theme name:Theme-Child
Template:theme-parent
*/
@import url('../theme-parent/style.css')
Theme name后面内容是你的子主题名称,Template后面填写父主题文件夹名,下面的url修改成父主题下的style.css的相对路径。
此时子主题已经制作完成,它和父主题一毛一样,因为我们没有加任何新的内容。若想加入新的函数, ...
Apache字体文件跨域问题
开启cdn加速后,我在浏览器中遇到了数十条类似下面的报错:
...has been blocked by CORS policy: No 'Access-Control-Allow-Origin'...
就是个CORS跨域问题,这里出问题的文件基本都是一些诸如ttf、otf什么的字体文件。相信各位都比较清楚跨域是啥、什么时候会产生跨域,这里不再多说。要解决这个问题也非常容易,这里针对apache(apache2)进行说明,nginx也类似。
首先登录apache2所在的服务器,跑一句命令:
a2enmod headers
开启mod_headers模块,然后重新加载配置:
/etc/init.d/apache2 force-reload
接下来打开站点的配置文件(.htaccess文件)
写入下面一段代码保存即可:
<FilesMatch "\.(ttf|otf|eot|woff|woff2|)(.*)">
<IfModule mod_headers.c>
Header set Access-Control-A ...
WordPress配置CDN加速
CDN(内容分发网络)可以根据用户的位置就近获取网站静态资源,降低网络的拥塞、减轻服务器压力。
这里我选择的平台依旧是阿里云,进入阿里云的控制台,找到CDN→域名管理→添加域名。(若想配置DCDN,前往阿里云DCDN控制台进行下面类似的操作即可。)
以cdn.fyz666.xyz为例,按上图进行配置以后,域名管理栏中就出现了你刚刚设置的加速域名,接下来根据需求需要进行DNS解析即可。
稍等片刻,解析记录就生效了。接下来就可以前往WordPress修改静态资源链接了。但一个一个修改实在是累,而且万一哪天不用cdn了还得改回来,就很麻烦,这里推荐一款WP插件:CDN Enabler
至此全站加速基本配置完了,还有一些小bug需要处理,例如字体文件被CORS跨域阻止。解决方法戳这里。
使用密钥登录SSH
由于使用密码登录ssh相对而言安全性差一点(而且每次都输密码太麻烦了),我们可以使用密钥进行ssh连接。
先在本地生成一对rsa密钥:
ssh-keygen -t rsa -m PEM -b 3072
随后一路回车即可。
接下来进入用户目录C://Users/用户名/,可以发现已经生成了一个.ssh文件夹。里面包含id_rsa和id_rsa.pub两个文件,其中后者是公钥文件。将公钥文件id_rsa.pub上传到服务器需要密钥登录的用户名文件夹的.ssh目录下(如果没有.ssh目录就自己创建一个),并将公钥文件重命名为authorized_keys,例如/home/user1/.ssh/authorized_keys。
现在在本地进行ssh连接:ssh user1@ip 已经默认使用密钥了。
接下来需要禁止该用户使用密码登录:
登录服务器修改/etc/ssh/sshd_config文件:
sudo vi /etc/ssh/sshd_config
添加下面内容(user1是禁用密码登录的用户名):
Match user user1
PasswordAuthenticati ...
Linux系统禁止root用户SSH登录
Root用户在linux系统中拥有至高无上的权力与地位,可以做任何你想做的事,因此若一旦被不怀好意的人暴力破解root用户的密码,服务器就会陷入危险境地。
(我的服务器:这么看得起我???)咳咳,虽然我的服务器不值得被其他人暴破,但流程还是要走一下的。阿里云的Linux服务器自带了一个可以在控制台无密码登录的admin用户,因此只要禁止root登录SSH即可。而我不太喜欢阿里云的远程连接界面,故又创了一个新用户。
禁止root用户登录的操作:
# 打开以下文件
sudo vi /etc/ssh/sshd_config
方法一方法二# 翻到文件最下面将这一项修改为no
PermitRootLogin no
# 重启sshd
sudo systemctl restart sshd.service
但这种方法过于简单粗暴,也直接限制了root的sftp登录,如果想让root用户仍可以登录sftp,则可以使用方法二。# 这一项不修改
PermitRootLogin yes
# 添加下面两行
Match user root
ForceCommand internal-sftp
# ...