我不清楚Keras中损失函数和指标之间的区别.该文档对我没有帮助.
我正在测试Keras中的一些网络架构,用于对MNIST数据集进行分类.我已经实现了一个类似于LeNet的.
我似乎在我在互联网上找到的例子中,有一个数据规范化的步骤.例如:
X_train /= 255
我已经进行了没有这种规范化的测试,我似乎已经降低了网络的性能(准确性)(保持相同的时期数).为什么会这样?
如果我增加了纪元的数量,精度可以达到通过标准化训练的模型所达到的水平?
那么,归一化会影响准确性,还是仅影响训练速度?
我的培训脚本的完整源代码如下:
from keras.models import Sequential
from keras.layers.convolutional import Conv2D
from keras.layers.convolutional import MaxPooling2D
from keras.layers.core import Activation
from keras.layers.core import Flatten
from keras.layers.core import Dense
from keras.datasets import mnist
from keras.utils import np_utils
from keras.optimizers import SGD, RMSprop, Adam
import numpy as np
import matplotlib.pyplot as plt
from keras import backend as k
def build(input_shape, classes):
model = Sequential()
model.add(Conv2D(20, kernel_size=5, padding="same",activation='relu',input_shape=input_shape))
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))
model.add(Conv2D(50, kernel_size=5, padding="same", activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2), …Run Code Online (Sandbox Code Playgroud) machine-learning neural-network deep-learning conv-neural-network keras
一般来说,当我需要在 C 中的闭区间内生成随机值(将 B 视为区间的开始,将 E 视为区间的结束)时,我使用以下方法之一:
方法一:
n = round(B + ( (float)rand() / RAND_MAX ) * (E - B));
Run Code Online (Sandbox Code Playgroud)
方法2:
n = B + rand()%(E - B+1);
Run Code Online (Sandbox Code Playgroud)
他们都考虑用函数 time() 初始化随机种子:
srand(time(NULL));
Run Code Online (Sandbox Code Playgroud)
在 Linux 系统中,这两种方法似乎都足以生成有趣的随机值。然而,在Windows系统中,有时数字显得不够随机。
研究这些系统,我发现 RAND_MAX 的值是不同的。在我测试过的Linux系统中,RAND_MAX是2147483647。在这些行为不太好的Windows系统中,RAND_MAX是32767。
我认为使用更大的 RAND_MAX 值我们可以生成更好的随机数。但我不确定。
考虑到这一点,我的问题是:是否有一些好方法可以生成在所有系统上都运行良好的有趣随机数(在闭区间内)?
除此之外,我的方法 1 和 2 是在闭区间内生成随机数的好方法吗?
我正在尝试将结构化文件读入 Bash 中的关联数组。该文件在每一行中存储一个人名和一个人地址。例如:
person1|address1
person2|address2
...
personN|addressN
Run Code Online (Sandbox Code Playgroud)
我正在使用下面的脚本。
#!/bin/bash
declare -A address
while read line
do
name=`echo $line | cut -d '|' -f 1`
add=`echo $line | cut -d '|' -f 2`
address[$name]=$add
echo "$name - ${address[$name]}"
done < adresses.txt
for name in ${!address[*]}
do
echo "$name - ${address[$name]}"
done
Run Code Online (Sandbox Code Playgroud)
脚本正常工作。但是,在 FOR 循环中,当人名有空格(例如“John Nobody”)时,我遇到了一些问题。我怎样才能解决这个问题?
让我们考虑以下代码:
#include <stdio.h>
int main(){
int size,i;
scanf("%d",&size);
int x[size];
for(i=0;i<size;i++){
x[i] = i;
}
for(i=0;i<size;i++){
printf("%d\n", x[i]);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我认为有些版本无法使用定义变量大小的变量声明数组,例如:
int x[size];
Run Code Online (Sandbox Code Playgroud)
但是我不确定是哪个版本。这在所谓的ANSI C中是允许的吗?
让我们考虑下面的代码:
#include <stdio.h>
int main()
{
float dollars;
int cents;
dollars = 159.95;
cents = dollars*100;
printf("Dollars:%f\tCents:%d\n",dollars,cents);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出将是:
Dollars: 159.949997 Cents:15995
Run Code Online (Sandbox Code Playgroud)
据我所知,159.95 没有精确的二进制表示。但我不确定为什么值 15995 存储在变量 cents 中。
我想知道在这些情况下是否需要在表达式中使用 round,这样:
cents = round(dollars*100);
Run Code Online (Sandbox Code Playgroud)
处理这些案例的最佳做法是什么?
请注意,这个使用货币的示例只是一个示例。我想讨论一下一般情况。是否有进行此类操作的一般最佳实践?
我想知道我们用于在 C 中打开文件的模式(文本或二进制)是否真的很重要。
例如,一般情况下,我们使用fread和fwrite来进行二进制模式的读写。当我们以文本模式打开文件时可以使用这些函数吗?
除此之外,一般情况下,我们可以使用fscanf和fprintf来进行文本模式的读写。如果我们以二进制模式打开文件,可以使用这些函数吗?
以文本或二进制模式打开文件会产生什么后果?
让我们考虑下面的代码:
#include <stdio.h>
int main()
{
float x = 0.33;
printf("%.100f",x);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如果float有6位精度,那么如何用 来显示超过6位的数字printf?
我正在尝试使用Bash脚本将结构化文件的信息读入关联数组.该文件在每行中包含一个人的姓名及其地址,以"|"分隔.例如:
person1|address of person1
person2|address of person2
...
personN|address of personN
Run Code Online (Sandbox Code Playgroud)
我尝试使用下面的脚本执行此操作.在WHILE循环中,正在打印信息.但是,在FOR循环中,不打印信息.似乎信息没有存储在WHILE循环之外的关联数组中.
我究竟做错了什么?为什么这不起作用?有更有效的方法吗?
#!/bin/bash
declare -A address
cat adresses.txt | while read line
do
name=`echo $line | cut -d '|' -f 1`
add=`echo $line | cut -d '|' -f 2`
address[$name]=$add
echo "$name - ${address[$name]}"
done
for name in ${!address[*]}
do
echo "$name - ${address[$name]}"
done
Run Code Online (Sandbox Code Playgroud) 据我所知,当我们创建数组或字符串时,它们的名称是指向其第一个元素的指针。在这种情况下,指针无法更改。
然而,这段代码可以工作:
#include <stdio.h>
void swapString(char **str1_ptr, char **str2_ptr)
{
char *temp = *str1_ptr;
*str1_ptr = *str2_ptr;
*str2_ptr = temp;
}
int main()
{
char strings[][30] = {"Test1","Test2","Test3"};
int i;
swapString((char **)&strings[0],(char **)&strings[1]);
for(i=0;i<3;i++){
printf("%s\n",strings[i]);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
为什么这个效果很好?以这种方式交换字符串(或一般的数组)是一个好习惯吗?什么时候使用这种方法不是一个好主意?
让我们假设下面的代码:
#include <stdio.h>
#include <math.h>
int abs(int x){
return x*2;
}
int main(){
printf("%d\n",abs(-2));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我编译并执行它时,我注意到正在使用math.h的abs函数。实际上,即使我删除#include <math.h>,也会发生这种情况。但我不明白这里发生了什么。