【发布时间】:2018-03-29 03:59:48
【问题描述】:
在Keras as a simplified interface to TensorFlow: tutorial 中,他们描述了如何在 TensorFlow 张量上调用 Keras 模型。
from keras.models import Sequential
model = Sequential()
model.add(Dense(32, activation='relu', input_dim=784))
model.add(Dense(10, activation='softmax'))
# this works!
x = tf.placeholder(tf.float32, shape=(None, 784))
y = model(x)
他们还说:
注意:通过调用 Keras 模型,您正在重用其架构和权重。当您在张量上调用模型时,您是在输入张量之上创建新的 TF 操作,这些操作正在重用模型中已经存在的 TF 变量实例。
我将此解释为y 中的模型权重与模型中的权重相同。但是,对我来说,生成的 Tensorflow 节点中的权重似乎已重新初始化。下面是一个最小的例子:
import numpy as np
from keras.models import Sequential
from keras.layers import Dense
# Create model with weight initialized to 1
model = Sequential()
model.add(Dense(1, input_dim=1, kernel_initializer='ones',
bias_initializer='zeros'))
model.compile(loss='binary_crossentropy', optimizer='adam',
metrics=['accuracy'])
# Save the weights
model.save_weights('file')
# Create another identical model except with weight initialized to 0
model2 = Sequential()
model2.add(Dense(1, input_dim=1, kernel_initializer='zeros',
bias_initializer='zeros'))
model2.compile(loss='binary_crossentropy', optimizer='adam',
metrics=['accuracy'])
# Load the weight from the first model
model2.load_weights('file')
# Call model with Tensorflow tensor
v = tf.Variable([[1, ], ], dtype=tf.float32)
node = model2(v)
sess = tf.Session()
init = tf.global_variables_initializer()
sess.run(init)
print(sess.run(node), model2.predict(np.array([[1, ], ])))
# Prints (array([[ 0.]], dtype=float32), array([[ 1.]], dtype=float32))
我为什么要这样做:
如果网络“惩罚”搜索空间中不允许的位置,我想在另一个最小化方案中使用经过训练的网络。因此,如果您有不涉及这种特定方法的想法,那也非常感谢。
【问题讨论】:
标签: tensorflow keras