激活函数:ReLU(x) = max(0,x), Sigmoid(x) = 1 / (1 + exp(-x))
None表示无激活函数,也可以理解为 None(x) = x
输入样例中的第二个网络结构如下图所示:
计算过程介绍:
魔法卷轴上的部分魔咒:
/*
C++中的容器:vector 向量,或者说动态数组的使用方法:
定义一个元素类型为double的动态数组:
vector<double> vec;
向动态数组中加入1到n共n个整数:
for(int i=1;i<=n;i++)
vec.push_back(i);
获得动态数组的长度:
int len = vec.size();
遍历并输出动态数组:
for(int i=0;i<len;i++)
cout<<vec[i]<<' ';
*/
#include<bits/stdc++.h>
using namespace std;
void read_vector(vector<double> &vec, int len) //读入一个向量
{
double x;
for(int i=1;i<=len;i++) {
cin>>x;
vec.push_back(x);
}
}
void read(vector<vector<double> > &in_paras, int len_in, int len_out) //读入一层参数,入口长度为len_in,出口为len_out
{
for(int i=1;i<=len_out;i++) {
vector<double> in_para;
read_vector(in_para, len_in);
in_paras.push_back(in_para);
}
}
string type;
const double e = 2.718;
double activate(double x) //激活函数
{
if(type=="Sigmoid") {
//这一部分变得模糊不清
}
double dot(vector<double> &in, vector<double> &in_para) //向量的点积
{
int len1 = in.size();
//这一部分变得模糊不清
}
vector<double> get(vector<double> &in, vector<vector<double> > &in_paras, vector<double> &bias) //对于输入向量,经过与参数层in_paras的运算,得到输出向量
{
vector<double> outs;
int len_out = in_paras.size();
for(int i=0;i<len_out;i++) {
double out = activate(dot(in, in_paras[i])+bias[i]);
outs.push_back(out);
}
return outs;
}
double solve()
{
int n, m, k;
cin>>n>>m>>k;
cin>>type;
vector<double> in;
read_vector(in, k);
vector<vector<double> > in_paras[m+5];
read(in_paras[1], k, n);
for(int i=2;i<=m;i++)
read(in_paras[i], n, n);
read(in_paras[m+1], n, 1);
vector<double> bias[m+5];
for(int i=1;i<=m;i++) read_vector(bias[i], n);
read_vector(bias[m+1], 1);
for(int i=1;i<=m+1;i++) {
in = get(in, in_paras[i], bias[i]);
}
return in[0];
}
// 这题真的很简单啊,运气只奖励给勇者!
int main () {
vector<int> ans;
double x = solve();
double y = solve();
double z = solve();
if(y>x) swap(x, y);
if(z>y) swap(z, y);
if(y>x) swap(x, y);
printf("%.2f %.2f %.2f\n", x, y, z);
}