- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试使用 Keras 中的全连接层架构进行二进制分类,这在 Keras 中称为密集类。
这是我创建的神经网络架构的设计:
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation
from keras.optimizers import SGD
self.model = Sequential()
# Dense(64) is a fully-connected layer with 64 hidden units.
# in the first layer, you must specify the expected input data shape:
# here, 20-dimensional vectors.
self.model.add(Dense(32, activation='relu', input_dim=self.x_train_std.shape[1]))
#self.model.add(Dropout(0.5))
#self.model.add(Dense(64, activation='relu'))
#self.model.add(Dropout(0.5))
self.model.add(Dense(1, activation='sigmoid'))
所以我有一个 17000,2000 的输入矩阵,其中 17K 个样本具有 2k 个特征。
我只保留了一个隐藏层,里面有 32 个单元或神经元。
我的输出层是一个具有 sigmoid 激活函数的单神经元。
现在,当我尝试检查第一个隐藏层的权重时,我希望它的大小为 (2000,32),其中每一行对应于每个输入,每一列对应于该层中的每个单元。
这是 Keras 架构设置的配置:
dl_1.model.get_config()
Out[70]:
[{'class_name': 'Dense',
'config': {'activation': 'relu',
'activity_regularizer': None,
'batch_input_shape': (None, 2000),
'bias_constraint': None,
'bias_initializer': {'class_name': 'Zeros', 'config': {}},
'bias_regularizer': None,
'dtype': 'float32',
'kernel_constraint': None,
'kernel_initializer': {'class_name': 'VarianceScaling',
'config': {'distribution': 'uniform',
'mode': 'fan_avg',
'scale': 1.0,
'seed': None}},
'kernel_regularizer': None,
'name': 'dense_1',
'trainable': True,
'units': 32,
'use_bias': True}},
{'class_name': 'Dense',
'config': {'activation': 'sigmoid',
'activity_regularizer': None,
'bias_constraint': None,
'bias_initializer': {'class_name': 'Zeros', 'config': {}},
'bias_regularizer': None,
'kernel_constraint': None,
'kernel_initializer': {'class_name': 'VarianceScaling',
'config': {'distribution': 'uniform',
'mode': 'fan_avg',
'scale': 1.0,
'seed': None}},
'kernel_regularizer': None,
'name': 'dense_2',
'trainable': True,
'units': 1,
'use_bias': True}}]
查看第一个隐藏层的维度:
dl_1.model.get_layer(name="dense_1").input_shape
(None, 2000)
输出大小:
dl_1.model.get_layer(name="dense_1").output_shape
Out[99]:
(None, 32)
所以它似乎确实给出了预期的 (2000,32)。
然而,当我尝试检查这一层的权重矩阵时
dl_1.model.get_layer(name="dense_1").get_weights()[0]
它给了我一个 numpy 数组列表,列表长度为 2000,数组长度在 32 内,如下所示:
array([[ 0.0484077 , -0.02401097, -0.03099879, -0.02864455, -0.01511723,
0.01386002, 0.01127522, 0.00844895, -0.02420873, 0.04466306,
0.02965425, 0.0410631 , 0.02397312, 0.0038885 , 0.04846045,
0.00653989, -0.05288456, -0.00325713, 0.0445733 , 0.04594839,
0.02839083, 0.0445912 , -0.0140048 , -0.01198476, 0.05259909,
-0.03752745, -0.01337494, -0.02162734, -0.01522341, 0.01208428,
0.01122886, 0.01496441],
[ 0.05225918, 0.04231448, 0.01388102, -0.03310467, -0.05293509,
0.01130457, 0.03127011, -0.04250741, -0.04212657, -0.01595866,
-0.002456 , 0.01112743, 0.0150629 , 0.03072598, -0.04061607,
-0.01131565, -0.02259113, 0.00907649, -0.04728404, -0.00909081,
0.03182121, -0.04608218, -0.04411709, -0.03561752, 0.04686243,
-0.04555761, 0.04087613, 0.04380137, 0.02079088, -0.02390963,
-0.0164928 , -0.01228274],
我不确定我是否理解这一点。它应该是 32 X2000 而不是 2000 X 32。所以我期望因为我有 32 个单元,并且每个单元有 2000 个权重,所以列表的长度为 32 个元素,每个元素应该是 2000 维的 numpy 数组。但它是相反的。我不确定这是为什么?
权重与隐藏层相关联,而不是输入层,所以如果我认为他们为输入层显示它是没有意义的。
知道这是怎么回事吗?
最佳答案
您正在创建一个包含 32 个单元的 Dense()
层。 Dense
层是(如您在代码中的注释所示)“完全连接的层”,这意味着数据中的每个特征都连接到每个层。您的数据元素中还有 2000 个特征。
因此,您获得的数组有 2000 个元素,每个元素对应一个特征,每个元素有 32 个权重,每个隐藏层一个,因此您得到的形状。
来自keras docs我们可以看到例子:
model = Sequential()
model.add(Dense(32, input_shape=(16,)))
# now the model will take as input arrays of shape (*, 16)
# and output arrays of shape (*, 32)
# after the first layer, you don't need to specify
# the size of the input anymore:
model.add(Dense(32))
在你的情况下 *
是 2000 所以你的输出权重应该是 (2000,32)
你得到的形状。这似乎是 Keras 用于其输出的约定。无论哪种方式,您都可以转换数据以赋予它其他形状,因为 (N, M)
数组与 (M, N)
数组具有相同数量的元素。
关于python - 了解每一层的Keras权重矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44791014/
我有兴趣在 tf.keras 中训练一个模型,然后用 keras 加载它。我知道这不是高度建议,但我对使用 tf.keras 来训练模型很感兴趣,因为 tf.keras 更容易构建输入管道 我想利用
我进行了大量搜索,但仍然无法弄清楚如何编写具有多个交互输出的自定义损失函数。 我有一个神经网络定义为: def NeuralNetwork(): inLayer = Input((2,));
我正在阅读一篇名为 Differential Learning Rates 的文章在 Medium 上,想知道这是否可以应用于 Keras。我能够找到在 pytorch 中实现的这项技术。这可以在 K
我正在实现一个神经网络分类器,以打印我正在使用的这个神经网络的损失和准确性: score = model.evaluate(x_test, y_test, verbose=False) model.m
我最近在查看模型摘要时遇到了这个问题。 我想知道,[(None, 16)] 和有什么区别?和 (None, 16) ?为什么输入层有这样的输入形状? 来源:model.summary() can't
我正在尝试使用 Keras 创建自定义损失函数。我想根据输入计算损失函数并预测神经网络的输出。 我尝试在 Keras 中使用 customloss 函数。我认为 y_true 是我们为训练提供的输出,
我有一组样本,每个样本都是一组属性的序列(例如,一个样本可以包含 10 个序列,每个序列具有 5 个属性)。属性的数量总是固定的,但序列的数量(时间戳)可能因样本而异。我想使用这个样本集在 Keras
Keras 在训练集和测试集文件夹中发现了错误数量的类。我有 3 节课,但它一直说有 4 节课。有人可以帮我吗? 这里的代码: cnn = Sequential() cnn.add(Conv2D(32
我想编写一个自定义层,在其中我可以在两次运行之间将变量保存在内存中。例如, class MyLayer(Layer): def __init__(self, out_dim = 51, **kwarg
我添加了一个回调来降低学习速度: keras.callbacks.ReduceLROnPlateau(monitor='val_loss', factor=0.5, patience=100,
在 https://keras.io/layers/recurrent/我看到 LSTM 层有一个 kernel和一个 recurrent_kernel .它们的含义是什么?根据我的理解,我们需要 L
问题与标题相同。 我不想打开 Python,而是使用 MacOS 或 Ubuntu。 最佳答案 Python 库作者将版本号放入 .__version__ 。您可以通过在命令行上运行以下命令来打印它:
Keras 文档并不清楚这实际上是什么。我知道我们可以用它来将输入特征空间压缩成更小的空间。但从神经设计的角度来看,这是如何完成的呢?它是一个自动编码器,RBM吗? 最佳答案 据我所知,嵌入层是一个简
我想实现[http://ydwen.github.io/papers/WenECCV16.pdf]中解释的中心损失]在喀拉斯 我开始创建一个具有 2 个输出的网络,例如: inputs = Input
我正在尝试实现多对一模型,其中输入是大小为 的词向量d .我需要输出一个大小为 的向量d 在 LSTM 结束时。 在此 question ,提到使用(对于多对一模型) model = Sequenti
我有不平衡的训练数据集,这就是我构建自定义加权分类交叉熵损失函数的原因。但问题是我的验证集是平衡的,我想使用常规的分类交叉熵损失。那么我可以在 Keras 中为验证集传递不同的损失函数吗?我的意思是用
DL 中的一项常见任务是将输入样本归一化为零均值和单位方差。可以使用如下代码“手动”执行规范化: mean = np.mean(X, axis = 0) std = np.std(X, axis =
我正在尝试学习 Keras 并使用 LSTM 解决分类问题。我希望能够绘制 准确率和损失,并在训练期间更新图。为此,我正在使用 callback function . 由于某种原因,我在回调中收到的准
在 Keras 内置函数中嵌入使用哪种算法?Word2vec?手套?其他? https://keras.io/layers/embeddings/ 最佳答案 简短的回答是都不是。本质上,GloVe 的
我有一个使用 Keras 完全实现的 LSTM RNN,我想使用梯度剪裁,梯度范数限制为 5(我正在尝试复制一篇研究论文)。在实现神经网络方面,我是一个初学者,我将如何实现? 是否只是(我正在使用 r
我是一名优秀的程序员,十分优秀!