我有以下简单的神经网络(只有 1 个神经元)来测试Keras的sigmoid激活和计算精度binary_crossentropy:
model = Sequential()
model.add(Dense(1, input_dim=1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
Run Code Online (Sandbox Code Playgroud)
为了简化测试,我手动设置唯一权重为1,偏置为0,然后用2点训练集评估模型{(-a, 0), (a, 1)},即
y = numpy.array([0, 1])
for a in range(40):
x = numpy.array([-a, a])
keras_ce[a] = model.evaluate(x, y)[0] # cross-entropy computed by keras/tensorflow
my_ce[a] = np.log(1+exp(-a)) # My own computation
Run Code Online (Sandbox Code Playgroud)
我的问题: 我发现由 Keras keras_ce/Tensorflow 计算的二元交叉熵 ( ) 达到了大约1.09e-7什么时候的下限a。16,如下图(蓝线)。随着“a”不断增长,它不会进一步减少。这是为什么?
该神经网络只有 1 个神经元,其权重设置为 1,偏差为 0。使用 2 点训练集{(-a, 0), (a, 1)},binary_crossentropy只需
-1/2 [ log(1 …
好吧,所以我准备tf.nn.softmax_cross_entropy_with_logits()在Tensorflow中运行该功能.
我的理解是'logits'应该是一个概率张量,每一个都对应于一个像素的概率,它是图像的一部分,最终将成为"狗"或"卡车"或其他......有限的事情的数量.
据我了解,logits插入等式的右侧.也就是说,它们是每个x(图像)的q.如果它们的概率从0到1 ......那对我来说是有意义的.但是当我运行我的代码并最终得到一些logits时,我没有得到概率.相反,我得到了正面和负面的浮动:
-0.07264724 -0.15262917 0.06612295 ..., -0.03235611 0.08587133 0.01897052 0.04655019 -0.20552202 0.08725972 ..., -0.02107313 -0.00567073 0.03241089 0.06872301 -0.20756687 0.01094618 ..., etc
Run Code Online (Sandbox Code Playgroud)
所以我的问题是......是吗?我是否必须以某种方式计算所有的logits并将它们转换为从0到1的概率?
我开始用张量流编写神经元网络,我的每个示例项目中都有一个问题.
我的损失总是从50或更高的东西开始并且没有减少,或者如果它减少,它的确如此缓慢,以至于在我所有的时代之后我甚至没有接近可接受的损失率.
它已经尝试过的事情(并没有太大影响结果)
我根据https://youtu.be/vq2nnJ4g6N0的知识创建了网络
但是,让我们看看我的一个测试项目:
我有一个名单列表,并希望假设性别,所以我的原始数据如下所示:
names=["Maria","Paul","Emilia",...]
genders=["f","m","f",...]
Run Code Online (Sandbox Code Playgroud)
为了将它提供给网络,我将名称转换为charCodes数组(期望最大长度为30)并将性别转换为位数组
names=[[77.,97. ,114.,105.,97. ,0. ,0.,...]
[80.,97. ,117.,108.,0. ,0. ,0.,...]
[69.,109.,105.,108.,105.,97.,0.,...]]
genders=[[1.,0.]
[0.,1.]
[1.,0.]]
Run Code Online (Sandbox Code Playgroud)
我为输出层建立了3个隐藏层[30,20],[20,10],[10,10]和[10,2]的网络.所有隐藏层都具有ReLU作为激活功能.输出层具有softmax.
# Input Layer
x = tf.placeholder(tf.float32, shape=[None, 30])
y_ = tf.placeholder(tf.float32, shape=[None, 2])
# Hidden Layers
# H1
W1 = tf.Variable(tf.truncated_normal([30, 20], stddev=0.1))
b1 = tf.Variable(tf.zeros([20]))
y1 = tf.nn.relu(tf.matmul(x, W1) + b1)
# H2
W2 = tf.Variable(tf.truncated_normal([20, 10], stddev=0.1))
b2 = tf.Variable(tf.zeros([10]))
y2 = tf.nn.relu(tf.matmul(y1, W2) + b2)
# …Run Code Online (Sandbox Code Playgroud) 我有一个产生4D输出张量的网络,其中空间维度(〜像素)中每个位置的值将被解释为该位置的类概率.换句话说,输出是(num_batches, height, width, num_classes).我有相同大小的标签,其中真实类被编码为一热.我想categorical-crossentropy用这个计算损失.
问题#1:该K.softmax函数需要2D张量(num_batches, num_classes)
问题2:我不确定每个位置的损失应该如何组合.reshape张量是否正确(num_batches * height * width, num_classes)然后再呼吁K.categorical_crossentropy?或者更确切地说,调用K.categorical_crossentropy(num_batches, num_classes)高度*宽度乘以平均结果?
machine-learning neural-network keras cross-entropy loss-function
也许有人能够在这里帮助我.我正在尝试计算网络给定输出的交叉熵损失
print output
Variable containing:
1.00000e-02 *
-2.2739 2.9964 -7.8353 7.4667 4.6921 0.1391 0.6118 5.2227 6.2540
-7.3584
[torch.FloatTensor of size 1x10]
Run Code Online (Sandbox Code Playgroud)
和所需的标签,形式
print lab
Variable containing:
x
[torch.FloatTensor of size 1]
Run Code Online (Sandbox Code Playgroud)
其中x是0到9之间的整数.根据pytorch文档(http://pytorch.org/docs/master/nn.html)
criterion = nn.CrossEntropyLoss()
loss = criterion(output, lab)
Run Code Online (Sandbox Code Playgroud)
这应该工作,但不幸的是我得到一个奇怪的错误
TypeError: FloatClassNLLCriterion_updateOutput received an invalid combination of arguments - got (int, torch.FloatTensor, !torch.FloatTensor!, torch.FloatTensor, bool, NoneType, torch.FloatTensor, int), but expected (int state, torch.FloatTensor input, torch.LongTensor target, torch.FloatTensor output, bool sizeAverage, [torch.FloatTensor weights or None], torch.FloatTensor total_weight, int ignore_index) …Run Code Online (Sandbox Code Playgroud) 我想知道为什么在Tensorflow 1.5.0及更高版本中,softmax_cross_entropy_with_logits_v2默认反向传播到标签和logits.您希望将哪些应用程序/场景支持标签?
我是Keras(以及ML)的新手,并且正在尝试训练二进制分类器。我正在使用加权二进制交叉熵作为损失函数,但不确定如何测试实现是否正确。
这是加权二进制交叉熵的准确实现吗?我该如何测试呢?
def weighted_binary_crossentropy(self, y_true, y_pred):
logloss = -(y_true * K.log(y_pred) * self.weights[0] + \
(1 - y_true) * K.log(1 - y_pred) * self.weights[1])
return K.mean(logloss, axis=-1)
Run Code Online (Sandbox Code Playgroud) 默认情况下,PyTorchcross_entropy采用 logits(模型的原始输出)作为输入。我知道将(log(softmax(x))) 和(负对数似然损失)CrossEntropyLoss结合在一个类中。所以,我想我可以用如下方法从概率中获得交叉熵损失:LogSoftmaxNLLLossNLLLoss
真实标签:[1, 0, 1]
概率:[0.1, 0.9], [0.9, 0.1], [0.2, 0.8]
其中,y_i,j表示真实值,即如果样本i属于类别,则为1 j,否则为 0。并表示属于 类 的p_i,j样本模型预测的概率。ij
如果我手工计算的话,结果是:
>>> -(math.log(0.9) + math.log(0.9) + math.log(0.8))
0.4338
Run Code Online (Sandbox Code Playgroud)
使用 PyTorch:
>>> labels = torch.tensor([1, 0, 1], dtype=torch.long)
>>> probs = torch.tensor([[0.1, 0.9], [0.9, 0.1], [0.2, 0.8]], dtype=torch.float)
>>> F.nll_loss(torch.log(probs), labels)
tensor(0.1446)
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?为什么答案不同?
我目前正在与torch.nn.CrossEntropyLoss. 据我所知,批量计算损失是很常见的。但是,是否有可能计算多个批次的损失?
更具体地说,假设我们给出了数据
import torch
features = torch.randn(no_of_batches, batch_size, feature_dim)
targets = torch.randint(low=0, high=10, size=(no_of_batches, batch_size))
loss_function = torch.nn.CrossEntropyLoss()
Run Code Online (Sandbox Code Playgroud)
有没有一种方法可以一行计算
loss = loss_function(features, targets) # raises RuntimeError: Expected target size [no_of_batches, feature_dim], got [no_of_batches, batch_size]
Run Code Online (Sandbox Code Playgroud)
?
先感谢您!
*My Training Model*
def train(model,criterion,optimizer,iters):
epoch = iters
train_loss = []
validaion_loss = []
train_acc = []
validation_acc = []
states = ['Train','Valid']
for epoch in range(epochs):
print("epoch : {}/{}".format(epoch+1,epochs))
for phase in states:
if phase == 'Train':
model.train() *training the data if phase is train*
dataload = train_data_loader
else:
model.eval()
dataload = valid_data_loader
run_loss,run_acc = 0,0 *creating variables to calculate loss and acc*
for data in dataload:
inputs,labels = data
inputs = inputs.to(device)
labels = labels.to(device)
labels = labels.byte() …Run Code Online (Sandbox Code Playgroud) python deep-learning conv-neural-network cross-entropy pytorch