python显示minst数据集图片_python – Keras – 保存mnist数据集的图像嵌入

在callbacks.TensorBoard中,所谓的“嵌入”在广义上是任何层权重.根据

Keras documentation:

embeddings_layer_names: a list of names of layers to keep eye on. If None or empty list all the embedding layer will be watched.

因此,默认情况下,它将监视嵌入层,但您并不需要嵌入层来使用此可视化工具.

在您提供的MLP示例中,缺少的是embeddings_layer_names参数.你必须弄清楚你要想象的是哪些层.假设您想要显示所有Dense图层的权重(或Keras中的内核),您可以指定embeddings_layer_names,如下所示:

model = Sequential()

model.add(Dense(200, activation='relu', input_shape=(784,)))

model.add(Dropout(0.2))

model.add(Dense(100, activation='relu'))

model.add(Dropout(0.2))

model.add(Dense(60, activation='relu'))

model.add(Dropout(0.2))

model.add(Dense(30, activation='relu'))

model.add(Dropout(0.2))

model.add(Dense(10, activation='softmax'))

embedding_layer_names = set(layer.name

for layer in model.layers

if layer.name.startswith('dense_'))

tb = callbacks.TensorBoard(log_dir='temp', histogram_freq=10, batch_size=32,

write_graph=True, write_grads=True, write_images=True,

embeddings_freq=10, embeddings_metadata=None,

embeddings_layer_names=embedding_layer_names)

model.compile(...)

model.fit(...)

然后,您可以在TensorBoard中看到类似的内容:

如果你想弄清楚embeddings_layer_names发生了什么,你可以看到the relevant lines in Keras source.

编辑:

所以这是一个用于可视化图层输出的脏解决方案.由于原始的TensorBoard回调不支持这一点,因此实现新的回调似乎是不可避免的.

由于在这里占用大量的页面空间来重写整个TensorBoard回调,我只需要扩展原始的TensorBoard,并写出不同的部分(已经相当冗长).但是为了避免重复计算和模型保存,重写TensorBoard回调将是一种更好,更清洁的方式.

import tensorflow as tf

from tensorflow.contrib.tensorboard.plugins import projector

from keras import backend as K

from keras.models import Model

from keras.callbacks import TensorBoard

class TensorResponseBoard(TensorBoard):

def __init__(self, val_size, img_path, img_size, **kwargs):

super(TensorResponseBoard, self).__init__(**kwargs)

self.val_size = val_size

self.img_path = img_path

self.img_size = img_size

def set_model(self, model):

super(TensorResponseBoard, self).set_model(model)

if self.embeddings_freq and self.embeddings_layer_names:

embeddings = {}

for layer_name in self.embeddings_layer_names:

# initialize tensors which will later be used in `on_epoch_end()` to

# store the response values by feeding the val data through the model

layer = self.model.get_layer(layer_name)

output_dim = layer.output.shape[-1]

response_tensor = tf.Variable(tf.zeros([self.val_size, output_dim]),

name=layer_name + '_response')

embeddings[layer_name] = response_tensor

self.embeddings = embeddings

self.saver = tf.train.Saver(list(self.embeddings.values()))

response_outputs = [self.model.get_layer(layer_name).output

for layer_name in self.embeddings_layer_names]

self.response_model = Model(self.model.inputs, response_outputs)

config = projector.ProjectorConfig()

embeddings_metadata = {layer_name: self.embeddings_metadata

for layer_name in embeddings.keys()}

for layer_name, response_tensor in self.embeddings.items():

embedding = config.embeddings.add()

embedding.tensor_name = response_tensor.name

# for coloring points by labels

embedding.metadata_path = embeddings_metadata[layer_name]

# for attaching images to the points

embedding.sprite.image_path = self.img_path

embedding.sprite.single_image_dim.extend(self.img_size)

projector.visualize_embeddings(self.writer, config)

def on_epoch_end(self, epoch, logs=None):

super(TensorResponseBoard, self).on_epoch_end(epoch, logs)

if self.embeddings_freq and self.embeddings_ckpt_path:

if epoch % self.embeddings_freq == 0:

# feeding the validation data through the model

val_data = self.validation_data[0]

response_values = self.response_model.predict(val_data)

if len(self.embeddings_layer_names) == 1:

response_values = [response_values]

# record the response at each layers we're monitoring

response_tensors = []

for layer_name in self.embeddings_layer_names:

response_tensors.append(self.embeddings[layer_name])

K.batch_set_value(list(zip(response_tensors, response_values)))

# finally, save all tensors holding the layer responses

self.saver.save(self.sess, self.embeddings_ckpt_path, epoch)

要使用它:

tb = TensorResponseBoard(log_dir=log_dir, histogram_freq=10, batch_size=10,

write_graph=True, write_grads=True, write_images=True,

embeddings_freq=10,

embeddings_layer_names=['dense_1'],

embeddings_metadata='metadata.tsv',

val_size=len(x_test), img_path='images.jpg', img_size=[28, 28])

在启动TensorBoard之前,您需要将标签和图像保存到log_dir以进行可视化:

from PIL import Image

img_array = x_test.reshape(100, 100, 28, 28)

img_array_flat = np.concatenate([np.concatenate([x for x in row], axis=1) for row in img_array])

img = Image.fromarray(np.uint8(255 * (1. - img_array_flat)))

img.save(os.path.join(log_dir, 'images.jpg'))

np.savetxt(os.path.join(log_dir, 'metadata.tsv'), np.where(y_test)[1], fmt='%d')

这是结果:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值