keras矩阵乘法的格式是什么

时间:2017-08-18 04:03:31

标签: python tensorflow keras

我在计算 z 时将数据从一个神经网络层传播到下一个神经网络层后面看到的所有数学运算如下:

z T x + b

但是keras似乎与该标准不同。它以行的样本数和列的特征数的形式接受其输入矩阵,get_weights()命令返回形状仅满足等式 z 的矩阵,如果以下是真的:

z =xθ+ b

给出以下网络学习输入尺寸为4x2且输出尺寸为4x1的XOR门的示例:

from keras.models import Sequential
from keras.layers import Dense
import numpy as np


X = np.array([[0,0],
              [1,0],
              [0,1],
              [1,1]])
Y = np.array([0,1,1,0])

model = Sequential()
model.add(Dense(10, input_dim=2, activation='sigmoid'))
model.add(Dense(10, activation='sigmoid'))
model.add(Dense(1, activation='sigmoid'))

model.compile(loss='binary_crossentropy', optimizer='sgd', metrics=['accuracy'])
model.fit(X, Y, epochs=100000, batch_size=4, verbose=0)

print model.get_weights()
print model.predict(X)

每层的模型权重分别为2x10,10x10和10x1。矩阵乘法不能满足为 z 给出的第一个等式,但似乎适用于第二个等式。 keras是否真的以这种方式处理其神经网络计算,还是我在某处错误解释代码中的某些内容?我的输入X尺寸应该换位吗?任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:0)

设置权重(形状)的方法存在问题。看一下这个例子,取自here

from keras.models import Sequential
from keras.layers.core import Dense, Dropout, Activation
from keras.optimizers import SGD
import numpy as np 

X = np.array([[0,0],[0,1],[1,0],[1,1]])
y = np.array([[0],[1],[1],[0]])

model = Sequential()
model.add(Dense(8, input_dim=2))
model.add(Activation('tanh'))
model.add(Dense(1))
model.add(Activation('sigmoid'))

sgd = SGD(lr=0.1)
model.compile(loss='binary_crossentropy', optimizer=sgd)

model.fit(X, y, show_accuracy=True, batch_size=1, nb_epoch=1000)
print(model.predict_proba(X))
"""
[[ 0.0033028 ]
 [ 0.99581173]
 [ 0.99530098]
 [ 0.00564186]]
"""

答案 1 :(得分:0)

一切按预期进行。请看一下here编写的代码,并搜索Dense类。

为了使操作更简单..这是代码的两个重要片段。 这就是内核的构建方式

 input_dim = input_shape[-1]

        self.kernel = self.add_weight(shape=(input_dim, self.units),
                                      initializer=self.kernel_initializer,
                                      name='kernel',
                                      regularizer=self.kernel_regularizer,
                                      constraint=self.kernel_constraint)

这就是乘法的方法

def call(self, inputs):
    output = K.dot(inputs, self.kernel)

如果您考虑这种方法,如何定义您的权重,input_dims等,那么一切都非常合理。 如果没有,请留下答复:)