众所周知,Keras是基于静态图的。但是,在我看来,实际情况并非如此,因为我可以使图形实现动态化。 这是证明我的主张的简单示例:
import keras.backend as K
import numpy as np
from keras.models import Model
from keras.layers import Dense, Input, Dropout
from keras.losses import mean_squared_error
def get_mnist():
np.random.seed(1234) # set seed for deterministic ordering
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_all = np.concatenate((x_train, x_test), axis = 0)
Y = np.concatenate((y_train, y_test), axis = 0)
X = x_all.reshape(-1,x_all.shape[1]*x_all.shape[2])
p = np.random.permutation(X.shape[0])
X = X[p].astype(np.float32)*0.02
Y = Y[p]
return X, Y
X, Y = get_mnist()
drop = K.variable(0.2)
input = Input(shape=(784,))
x = Dropout(rate=drop.value)(input)
x = Dense(128, activation="relu", name="encoder_layer")(x)
decoder = Dense(784, activation="relu", name="decoder_layer")(x)
autoencoder = Model(inputs=input, outputs=decoder)
autoencoder.compile(optimizer='adadelta', loss= mean_squared_error)
autoencoder.fit(X, X, batch_size=256, epochs=300)
K.set_value(drop, 0.5)
autoencoder.fit(X, X, batch_size=256, epochs=300)
很明显,即使在编译模型之后,我们也可以随时更改drop
的值。
如果它是静态图,我应该怎么做?
我错过了重点吗?
如果我这样做,动态图的真正解释是什么?
答案 0 :(得分:1)
确实可以随时更改drop
,但这并不意味着Keras支持动态图。您最可能会看到一个神经网络节点,它被描述为带有激活函数的线性函数。通过堆叠这些节点,您将获得一个神经网络。然后通过推理辍学是动态地取出节点。但是,这不是Keras辍学的实现。辍学会将节点输出设置为零。这可以通过将相应节点中的所有权重设置为零来完成。这些操作是等效的,因为前提是下一层没有从被丢弃的节点接收任何输出。但是,第一种方法需要动态图,第二种方法可以同时使用动态图和静态图来完成,这是Keras使用的实现。因此,不需要用于该操作的动态图。
要了解动态图是什么,它就是模型本身在变化。初始构建图后,删除操作不会改变图的体系结构(节点数,层数等)。
答案 1 :(得分:0)
当然不是因为退出层并没有真正影响网络体系结构。