在以下Keras和Tensorflow实现的神经网络训练model.train_on_batch([x], [y])中,keras实现sess.run([train_optimizer, cross_entropy, accuracy_op], feed_dict=feed_dict)中的方法与Tensorflow实现中的不同?特别是:这两条线在训练中如何导致不同的计算?:
keras_version.py
input_x = Input(shape=input_shape, name="x")
c = Dense(num_classes, activation="softmax")(input_x)
model = Model([input_x], [c])
opt = Adam(lr)
model.compile(loss=['categorical_crossentropy'], optimizer=opt)
nb_batchs = int(len(x_train)/batch_size)
for epoch in range(epochs):
loss = 0.0
for batch in range(nb_batchs):
x = x_train[batch*batch_size:(batch+1)*batch_size]
y = y_train[batch*batch_size:(batch+1)*batch_size]
loss_batch, acc_batch = model.train_on_batch([x], [y])
loss += loss_batch
print(epoch, loss / nb_batchs)
Run Code Online (Sandbox Code Playgroud)
tensorflow_version.py
input_x = Input(shape=input_shape, name="x")
c = Dense(num_classes)(input_x)
input_y = tf.placeholder(tf.float32, shape=[None, num_classes], name="label")
cross_entropy = tf.reduce_mean(
tf.nn.softmax_cross_entropy_with_logits_v2(labels=input_y, logits=c, name="xentropy"),
name="xentropy_mean" …Run Code Online (Sandbox Code Playgroud) 我有一个使用固定权重矩阵的自定义 keras 层。我想知道如何使用 keras API 和张量流来处理这个固定权重矩阵。特别是,为什么我要使用K.constantwhenself.add_weights(trainable=False)提供更大的灵活性(例如,我可以Layer.set_weights与后者一起使用)。
具体来说,在构建方法中我可以这样做:
class CustomLayer(Layer):
...
def build(self, input_shape):
self.fixed_tensor = K.constant(self.my_fixed_tensor)
self.built = True
Run Code Online (Sandbox Code Playgroud)
或者
class CustomLayer(Layer):
...
def build(self, input_shape):
self.fixed_tensor = self.add_weight(
shape=self.my_fixed_tensor.shape,
initializer=lambda shape, dtype: self.my_fixed_tensor,
trainable=False
)
self.built = True
Run Code Online (Sandbox Code Playgroud)
两种解决方案都有效,我想知道它们在后端的处理方式是否不同。
我正在尝试在 keras 中模拟 pytorch 神经网络。
我确信我的 keras 版本的神经网络与 pytorch 中的非常接近,但在训练期间,我看到 pytorch 网络的损失值远低于 keras 网络的损失值。我想知道这是不是因为我没有正确复制keras中的pytorch网络或者两个框架中的损失计算不同。
Pytorch 损失定义:
loss_function = nn.CrossEntropyLoss()
optimizer = optim.SGD(net.parameters(), lr=args.lr, momentum=0.9, weight_decay=5e-4)
Run Code Online (Sandbox Code Playgroud)
Keras 损失定义:
sgd = optimizers.SGD(lr=.1, momentum=0.9, nesterov=True)
resnet.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=['categorical_accuracy'])
Run Code Online (Sandbox Code Playgroud)
请注意,根据源代码,keras 网络中的所有层都已使用 L2 正则化实现kernel_regularizer=regularizers.l2(5e-4),我还使用了he_uniform我认为在 pytorch 中默认的初始化。
两个网络的批量大小相同:128.
在 pytorch 版本中,我得到了大约4.1209减少到大约 的损失值0.5。在 keras 中,它从 30 左右开始并减少到2.5.
我有一个函数可以采用多种typing.Union类型,包括 type torch.float。但如果我使用typing.Unionwithtorch.float作为参数,我会收到错误。这是一个例子:
from typing import Union
import torch
def fct(my_float_or_tensor: Union[torch.float, torch.Tensor]):
pass
Run Code Online (Sandbox Code Playgroud)
我得到了错误
TypeError: Union[t0, t1, ...]: each t must be a type. Got torch.float32.
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
有趣的是,特殊类型也会出现同样的问题,但如果我在类型提示时直接typing.Tuple使用,则不会出现同样的问题。torch.float
一旦我安装了miniconda,我就永远在root miniconda环境中,例如:
luc@montblanc:~$ conda info --envs
# conda environments:
#
bunnies /home/luc/miniconda3/envs/bunnies
expose /home/luc/miniconda3/envs/expose
testano /home/luc/miniconda3/envs/testano
testcondaenv /home/luc/miniconda3/envs/testcondaenv
root * /home/luc/miniconda3
Run Code Online (Sandbox Code Playgroud)
哪个结果使用了这个环境python3可执行文件:
luc@montblanc:~$ which python3
/home/luc/miniconda3/bin/python3
Run Code Online (Sandbox Code Playgroud)
如何在没有实际卸载python的情况下离开这个根环境.我想要
luc@montblanc:~$ which python3
/usr/bin/python3
Run Code Online (Sandbox Code Playgroud)
并/home/luc/miniconda3/bin/python3在需要时明确地引用python的miniconda分布(使用完整路径).
我不想达到任何最终目标,我只是想了解发生了什么以及它是如何工作的.