我尝试在Keras(tf.keras)中构建一个堆栈式自动编码器。通过堆叠我的意思并不是很深。我为Keras找到的所有示例都在生成例如3个编码器层,3个解码器层,它们对其进行训练,并称之为一天。但是,本文介绍的一种训练堆叠式自动编码器(SAE)的正确方法似乎是:堆叠式降噪自动编码器:使用局部降噪标准在深度网络中学习有用的表示形式
简而言之,应该对SAE进行分层训练,如下图所示。训练完第1层后,将其用作训练第2层的输入。应将重建损失与第1层而不是输入层进行比较。
这就是我的麻烦开始的地方。如何告诉Keras在哪些层上使用损失函数?
这是我的工作。由于Keras中已不存在自动编码器模块,因此我构建了第一个自动编码器,并将其编码器的权重(trainable = False)设置在第二个自动编码器的第一层(总共2层)中。然后,当我训练它时,它显然将重建的图层out_s2与输入图层in_s而不是图层1进行比较hid1。
# autoencoder layer 1
in_s = tf.keras.Input(shape=(input_size,))
noise = tf.keras.layers.Dropout(0.1)(in_s)
hid = tf.keras.layers.Dense(nodes[0], activation='relu')(noise)
out_s = tf.keras.layers.Dense(input_size, activation='sigmoid')(hid)
ae_1 = tf.keras.Model(in_s, out_s, name="ae_1")
ae_1.compile(optimizer='nadam', loss='binary_crossentropy', metrics=['acc'])
# autoencoder layer 2
hid1 = tf.keras.layers.Dense(nodes[0], activation='relu')(in_s)
noise = tf.keras.layers.Dropout(0.1)(hid1)
hid2 = tf.keras.layers.Dense(nodes[1], activation='relu')(noise)
out_s2 = tf.keras.layers.Dense(nodes[0], activation='sigmoid')(hid2)
ae_2 = tf.keras.Model(in_s, out_s2, name="ae_2")
ae_2.layers[0].set_weights(ae_1.layers[0].get_weights())
ae_2.layers[0].trainable = False
ae_2.compile(optimizer='nadam', …Run Code Online (Sandbox Code Playgroud) 我有一个大数据集(300.000 个示例 x 33.000 个特征),这当然不适合内存。数据以 HDF5 格式保存。这些值大多为零(稀疏数据)。它们看起来像这样:
Attr1 52 52 52 52 52 52 52 52 ...
Attr2 umb umb umb umb umb umb umb umb ...
CellID TGC-1 TGG-1 CAG-1 TTC-1 GTG-1 GTA-1 CAA-1 CAC-1 ...
Acc Gene ...
243485 RP11-.3 0 0 0 0 0 0 0 0 ...
237613 FAM138A 0 0 0 0 0 0 0 0 ...
186092 OR4F5 0 0 0 0 0 0 0 0 ...
238009 RP11-.7 0 0 0 0 0 …Run Code Online (Sandbox Code Playgroud) 我安装了最新的TensorFlow(v1.1.0),并尝试运行tf.contrib.learn快速入门教程,您可以在其中为IRIS数据集构建分类器.但是,当我尝试时:
training_set = tf.contrib.learn.datasets.base.load_csv_with_header(
filename=IRIS_TRAINING,
target_dtype=np.int,
features_dtype=np.float32)
Run Code Online (Sandbox Code Playgroud)
我收到了一个StopIteration错误.
当我检查API时,我没有找到任何关于load_csv_with_header().他们是否在最新版本中更改了它而没有更新教程?我怎样才能解决这个问题?
编辑:如果这有任何区别,我使用Python3.6.