python - 保存深度网络并在 Tensorflow 中更改其中心层
问题描述
我在 TensorFlow 中构建了一个自动编码器。它有 5 个隐藏层。我训练了网络,现在我希望将其保存在一些外部文件中。
稍后,我想重新加载自动编码器并修改其中心层。然后我想在一些输入数据上运行自动编码器。
这是我的自动编码器代码。我在saver
其中插入了一些我认为它们可以帮助我保存模型的行。但是,我不确定如何重新加载保存的模型,最重要的是如何修改其中心层。
input = ### some data
output = input
tf.reset_default_graph()
num_inputs=501
num_hid1=250
num_hid2=100
num_hid3=50
num_hid4=num_hid2
num_hid5=num_hid1
num_output=num_inputs
lr=0.01
actf=tf.nn.tanh
X=tf.placeholder(tf.float32,shape=[None,num_inputs])
initializer=tf.variance_scaling_initializer()
w1=tf.Variable(initializer([num_inputs,num_hid1]),dtype=tf.float32)
w2=tf.Variable(initializer([num_hid1,num_hid2]),dtype=tf.float32)
w3=tf.Variable(initializer([num_hid2,num_hid3]),dtype=tf.float32)
w4=tf.Variable(initializer([num_hid3,num_hid4]),dtype=tf.float32)
w5=tf.Variable(initializer([num_hid4,num_hid5]),dtype=tf.float32)
w6=tf.Variable(initializer([num_hid5,num_output]),dtype=tf.float32)
b1=tf.Variable(tf.zeros(num_hid1))
b2=tf.Variable(tf.zeros(num_hid2))
b3=tf.Variable(tf.zeros(num_hid3))
b4=tf.Variable(tf.zeros(num_hid4))
b5=tf.Variable(tf.zeros(num_hid5))
b6=tf.Variable(tf.zeros(num_output))
hid_layer1=actf(tf.matmul(X,w1)+b1)
hid_layer2=actf(tf.matmul(hid_layer1,w2)+b2)
hid_layer3=actf(tf.matmul(hid_layer2,w3)+b3)
hid_layer4=actf(tf.matmul(hid_layer3,w4)+b4)
hid_layer5=actf(tf.matmul(hid_layer4,w5)+b5)
output_layer=tf.matmul(hid_layer5,w6)+b6
loss=tf.reduce_mean(tf.square(output_layer-X))
optimizer=tf.train.AdamOptimizer(lr)
train=optimizer.minimize(loss)
init=tf.global_variables_initializer()
num_epoch=100000
batch_size=150
saver = tf.train.Saver()
with tf.Session() as sess:
sess.run(init)
for epoch in range(num_epoch):
sess.run(train,feed_dict={X:input})
train_loss=loss.eval(feed_dict={X:input})
print("epoch {} loss {}".format(epoch,train_loss))
results=output_layer.eval(feed_dict={X:input})
saver.save(sess, 'my_test_model')
编辑:
在回复@mujjiga 的回答时,实际上我要做的就是砍掉这个自动编码器的编码器部分。然后使用剩余的解码器解码一组新的hid_layer3
特征。
解决方案
如果您打算砍掉解码器部分并使用编码器来获取输入的潜在表示(自动编码器的正常应用),那么您可以执行以下操作(如果hid_layer3
表示编码器的潜在表示/输出)
tf.reset_default_graph()
num_inputs=501
num_hid1=250
num_hid2=100
num_hid3=50
num_hid4=num_hid2
num_hid5=num_hid1
num_output=num_inputs
lr=0.01
actf=tf.nn.tanh
output = np.random.rand(100,num_inputs)
X=tf.placeholder(tf.float32,shape=[None,num_inputs])
initializer=tf.variance_scaling_initializer()
w1=tf.Variable(initializer([num_inputs,num_hid1]),dtype=tf.float32)
w2=tf.Variable(initializer([num_hid1,num_hid2]),dtype=tf.float32)
w3=tf.Variable(initializer([num_hid2,num_hid3]),dtype=tf.float32)
w4=tf.Variable(initializer([num_hid3,num_hid4]),dtype=tf.float32)
w5=tf.Variable(initializer([num_hid4,num_hid5]),dtype=tf.float32)
w6=tf.Variable(initializer([num_hid5,num_output]),dtype=tf.float32)
b1=tf.Variable(tf.zeros(num_hid1))
b2=tf.Variable(tf.zeros(num_hid2))
b3=tf.Variable(tf.zeros(num_hid3))
b4=tf.Variable(tf.zeros(num_hid4))
b5=tf.Variable(tf.zeros(num_hid5))
b6=tf.Variable(tf.zeros(num_output))
hid_layer1=actf(tf.matmul(X,w1)+b1)
hid_layer2=actf(tf.matmul(hid_layer1,w2)+b2)
hid_layer3=actf(tf.matmul(hid_layer2,w3)+b3)
hid_layer4=actf(tf.matmul(hid_layer3,w4)+b4)
hid_layer5=actf(tf.matmul(hid_layer4,w5)+b5)
output_layer=tf.matmul(hid_layer5,w6)+b6
saver = tf.train.Saver()
with tf.Session() as sess:
saver.restore(sess, 'my_test_model')
print("Model restored.")
x = sess.run(hid_layer3, feed_dict={X:output})
assert x.shape[1] == hid_layer3.shape[1]
如您所见,您仍然需要定义模型架构,但从保存的模型中加载权重。
推荐阅读
- vim - 在 vim 中,如何更改当前突出显示的搜索词的突出显示颜色?
- google-maps-api-3 - 离线可视化 PowerBI 地图上的经纬度 GPS 点?
- javascript - Stretch to fit the entire screen without keeping aspect ratio and without scrollbars
- python - 'TypeError: 'datetime.datetime' object is not iterable' 尝试将日期列表与单个日期进行比较时
- python - 如何让弹跳球环绕 x 轴
- c# - 在控制台应用程序中重用我的 ASP.NET Core MVC 应用程序中的代码:如何进行数据库连接
- augmented-reality - A-FRAME:如何显示 SVG 动画
- c# - 实体框架 DbContext 过滤的计数查询使用变量非常慢
- python-3.x - 射线标准输出到哪里去了?
- android - 协程、异步 DiffUtil 和不一致检测错误