Python Keras动态图

Python Keras动态图,python,keras,Python,Keras,众所周知,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

众所周知,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
的值,即使在编译模型之后也是如此。
如果它是一个静态图,我应该如何做到这一点?
我没抓住重点吗?

如果我这样做了,那么动态图的真正解释是什么?

确实可以随时更改
删除
,但这并不意味着Keras支持动态图。您很可能已经习惯了将神经网络节点描述为带有激活函数的线性函数。通过叠加这些节点,你可以得到一个神经网络。然后,通过推理,dropout所做的就是动态地删除节点。然而,这并不是Keras实施的辍学。Dropout将节点输出设置为零。这可以通过将各个节点中的所有权重设置为零来实现。这些操作是等效的,因为前提是下一层不会从丢弃的节点接收任何输出。然而,第一种方法需要动态图,第二种方法可以同时使用动态图和静态图,这是Keras使用的实现。因此,此操作不需要动态图


要理解动态图是什么,需要模型本身发生变化。在最初构建图形之后,退出操作不会改变图形体系结构(节点数、层数等)

确实,您可以随时更改
删除
,但这并不意味着Keras支持动态图。您很可能已经习惯了将神经网络节点描述为带有激活函数的线性函数。通过叠加这些节点,你可以得到一个神经网络。然后,通过推理,dropout所做的就是动态地删除节点。然而,这并不是Keras实施的辍学。Dropout将节点输出设置为零。这可以通过将各个节点中的所有权重设置为零来实现。这些操作是等效的,因为前提是下一层不会从丢弃的节点接收任何输出。然而,第一种方法需要动态图,第二种方法可以同时使用动态图和静态图,这是Keras使用的实现。因此,此操作不需要动态图


要理解动态图是什么,需要模型本身发生变化。在最初构建图形之后,退出操作不会改变图形体系结构(节点数、层数等)

当然不是因为退出层不会真正影响网络体系结构。

当然不是因为退出层不会真正影响网络体系结构