python matplotlib画图显示不出来的原因。以及常见的二维转一维方式:squeeze()、reshape()、flatten()、ravel()函数

阅读前请看一下:我是一个热衷于记录的人,每次写博客会反复研读,尽量不断提升博客质量。文章设置为仅粉丝可见,是因为写博客确实花了不少精力。希望互相进步谢谢!!

1、问题描述:

提示:这里简述项目相关背景:

机器学习时python matplotlib画图显示不出来

train_x = np.array([50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70]).reshape((1, -1))
train_y = np.array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]).reshape((1, -1))
plt.figure()
plt.plot(train_x,train_y)
plt.xlabel("Iteration")
plt.ylabel("Costs")
plt.show()

在这里插入图片描述
看到上面啥也没有


2、原因分析:

train_x和train_y这里都是二维,shape为(1,20)

plot( )参数要求传入的是数组(一维)

关于plot()函数的参数和用法看下面两篇文章:

plt.plot()函数参数(最清晰的解释)
plt.plot()函数的具体用法


3、解决方案:

将train_x和train_y转化为 一维!!!

方法一,squeeze()函数

语法:numpy.squeeze(a,axis = None)

作用:从数组的形状中删除单维度条目,即把shape中为1的维度去掉

场景:在机器学习和深度学习中,通常算法的结果是可以表示向量的数组(即包含两对或以上的方括号形式[[]]),如果直接利用这个数组进行画图可能显示界面为空(见后面的示例)。我们可以利用squeeze()函数将表示向量的数组转换为秩为1的数组,这样利用matplotlib库函数画图时,就可以正常的显示结果了。

import numpy as np
import matplotlib.pyplot as plt
train_x = np.array([50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70]).reshape((1, -1))
train_y = np.array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]).reshape((1, -1))
plt.figure()
plt.plot(np.squeeze(train_x), np.squeeze(train_y))   #squeeze()函数删除单维度条目
plt.xlabel("Iteration")
plt.ylabel("Costs")
plt.show()

关于np.squeeze看下面这篇文章:

Numpy库学习—squeeze()函数

方法二,.reshape(-1)

.reshape(-1)转化为一维的行向量

import numpy as np
import matplotlib.pyplot as plt
train_x = np.array([50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70]).reshape((1, -1))
train_y = np.array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]).reshape((1, -1))
plt.figure()
plt.plot(train_x.reshape(-1), train_y.reshape(-1))
plt.xlabel("Iteration")
plt.ylabel("Costs")
plt.show()

关于.reshape(-1) 、.reshape(-1,1)、 .reshape(1,-1)看我之前写的文章
python numpy中的reshape(-1)、reshape(1,-1)、reshape(-1,1)

方法三,flatten()函数

import numpy as np
import matplotlib.pyplot as plt
train_x = np.array([50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70]).reshape((1, -1))
train_y = np.array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]).reshape((1, -1))
plt.figure()
plt.plot(train_x.flatten(), train_y.flatten())
plt.xlabel("Iteration")
plt.ylabel("Costs")
plt.show()

方法四,ravel()函数

import numpy as np
import matplotlib.pyplot as plt
train_x = np.array([50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70]).reshape((1, -1))
train_y = np.array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]).reshape((1, -1))
plt.figure()
plt.plot(train_x.ravel(), train_y.ravel())
plt.xlabel("Iteration")
plt.ylabel("Costs")
plt.show()

4、结论

画图时x,y一定要转化为一维,不然二维没法显示线,最多显示点!!!

掌握四种二维转一维的方法。


码字不易,谢谢点赞!!!
码字不易,谢谢点赞!!!
码字不易,谢谢点赞!!!

<think>好的,我现在需要帮助用户解决如何使用条件生成对抗网络(CGAN)结合Keras 3生成MNIST数据集的二维聚类可视化图的问题。首先,我需要回顾一下CGAN的基本原理和结构。CGAN与普通GAN的同之处在于生成器和判别器都接收额外的条件信息,通常是类别标签。在MNIST数据集的情况下,条件信息就是数字0到9的标签。 用户的需求是生成二维聚类图,这意味着需要将生成的数据或隐空间映射到二维平面,并进行可视化。常见的降维方法如t-SNE或PCA可以用于此。但结合CGAN的话,可能需要从生成器的潜在空间或中间层提取特征,然后进行降维。 接下来,我需要考虑Keras 3的特点。Keras 3支持TensorFlow、JAX和PyTorch后端,所以在编写代码时需要确保兼容性。过用户可能更倾向于使用TensorFlow,因为之前的引用中提到了CNN模型的搭建,可能用户对TensorFlow比较熟悉。 步骤分解可能包括以下几个部分: 1. 数据预处理:加载MNIST数据集,对图像进行标准化,并将标签换为条件向量。 2. 构建CGAN模型:定义生成器和判别器的结构,确保它们都接收条件标签作为输入。 3. 训练CGAN:设置训练循环,交替训练判别器和生成器。 4. 特征提取:从训练好的生成器中提取潜在空间的特征,或者使用判别器的中间层输出。 5. 降维可视化:应用t-SNE或PCA将高维特征降至二维,并绘制聚类图。 需要注意的地方: - 条件标签如何嵌入到生成器和判别器中。通常,标签会被换为嵌入向量并与输入拼接。 - 生成器的潜在空间可能需要调整,以确保生成的样本多样性。 - 在训练过程中,需要平衡判别器和生成器的训练,避免模式崩溃。 - 可视化部分可能需要结合真实数据和生成数据的特征,比较它们的聚类效果。 根据用户提供的引用,特别是引用[4]提到了条件GAN在MNIST上的应用,这可以作为参考。此外,引用[3]中的代码示例涉及了混淆矩阵和热力图,可能对可视化部分有帮助,但需要调整为聚类图。 可能的代码结构: - 使用Keras的函数式API构建生成器和判别器。 - 在生成器中,将潜在向量和条件标签连接,通过反卷积层生成图像。 - 在判别器中,将图像展平后与条件标签连接,通过全连接层或卷积层处理。 - 训练过程中,需要分别编译判别器和联合模型(生成器+判别器)。 在特征提取阶段,可能需要使用生成器的某个中间层(如全连接层)的输出作为特征,或者使用判别器的某个中间层对生成样本进行编码。然后将这些特征进行降维处理。 最后,绘制二维散点图,同颜色代表同类别,观察聚类情况。可能需要使用matplotlib或seaborn库。 潜在的问题: - 如何选择潜在空间的维度?通常使用较小的维度,如100维,但此处需要映射到二维可能需要调整。 - 条件信息是否正确传递并影响生成过程? - 训练时间和计算资源是否足够? 需要验证的步骤: 1. 确保CGAN能够生成高质量的MNIST数字,否则聚类效果可能理想。 2. 检查特征提取是否正确,降维后的数据是否保留足够的结构信息。 3. 可视化结果是否显示出清晰的类别分离。 另外,用户可能需要对比真实数据和生成数据的聚类情况,以评估CGAN的表现。或者,使用生成的数据来辅助聚类任务,如引用[1]提到的生成代表性聚类中心。 综上所述,解决方案的大致流程已经明确,接下来需要将这些步骤化为具体的代码实现,并注意各部分的衔接和调试。</think>以下是使用条件生成对抗网络(CGAN)在Keras 3中生成MNIST数据集二维聚类可视化图的实现步骤: ### 一、模型构建 1. **生成器结构** 输入:潜在噪声向量$z$ + 条件标签$y$ 实现方式:将标签通过嵌入层映射为向量,与噪声向量拼接后通过全连接层和反卷积层生成图像 $$G(z|y): \mathbb{R}^{d_z} \times \mathbb{R}^{10} \rightarrow \mathbb{R}^{28\times28}$$ 2. **判别器结构** 输入:图像$x$ + 条件标签$y$ 实现方式:将标签嵌入后与图像特征拼接,通过卷积层和全连接层输出判别概率 $$D(x|y): \mathbb{R}^{28\times28} \times \mathbb{R}^{10} \rightarrow [0,1]$$ ```python from keras import layers, models # 生成器 def build_generator(latent_dim=100, num_classes=10): noise = layers.Input(shape=(latent_dim,)) label = layers.Input(shape=(1,), dtype='int32') # 标签嵌入 label_embedding = layers.Embedding(num_classes, 50)(label) label_embedding = layers.Flatten()(label_embedding) # 合并噪声和标签 merged = layers.Concatenate()([noise, label_embedding]) x = layers.Dense(256 * 7 * 7)(merged) x = layers.Reshape((7, 7, 256))(x) x = layers.Conv2DTranspose(128, (3,3), strides=2, padding='same')(x) x = layers.Conv2DTranspose(64, (3,3), strides=2, padding='same')(x) output = layers.Conv2D(1, (7,7), activation='tanh', padding='same')(x) return models.Model([noise, label], output) # 判别器 def build_discriminator(img_shape=(28,28,1), num_classes=10): img = layers.Input(shape=img_shape) label = layers.Input(shape=(1,), dtype='int32') # 图像处理 x = layers.Conv2D(64, (3,3), strides=2, padding='same')(img) x = layers.LeakyReLU(0.2)(x) x = layers.Dropout(0.3)(x) x = layers.Conv2D(128, (3,3), strides=2, padding='same')(x) x = layers.LeakyReLU(0.2)(x) x = layers.Dropout(0.3)(x) x = layers.Flatten()(x) # 标签嵌入 label_embedding = layers.Embedding(num_classes, 50)(label) label_embedding = layers.Flatten()(label_embedding) # 合并特征 merged = layers.Concatenate()([x, label_embedding]) validity = layers.Dense(1, activation='sigmoid')(merged) return models.Model([img, label], validity) ``` ### 二、训练配置 ```python from keras.optimizers import Adam import numpy as np # 初始化模型 generator = build_generator() discriminator = build_discriminator() # 联合模型 noise = layers.Input(shape=(100,)) label = layers.Input(shape=(1,)) img = generator([noise, label]) discriminator.trainable = False validity = discriminator([img, label]) combined = models.Model([noise, label], validity) # 编译模型 discriminator.compile(loss='binary_crossentropy', optimizer=Adam(0.0002, 0.5)) combined.compile(loss='binary_crossentropy', optimizer=Adam(0.0002, 0.5)) ``` ### 三、特征提取与可视化 1. **生成潜在空间样本** 使用训练好的生成器生成带标签的合成数据 2. **提取隐层特征** 获取生成器中间层的激活值作为特征表示 ```python # 创建特征提取模型 feature_extractor = models.Model( inputs=generator.inputs, outputs=generator.layers[-4].output ) # 生成测试数据 def generate_latent_features(n_samples=1000): noise = np.random.normal(0, 1, (n_samples, 100)) labels = np.random.randint(0, 10, (n_samples, 1)) generated_images = generator.predict([noise, labels]) features = feature_extractor.predict([noise, labels]) return features.reshape(n_samples, -1), labels ``` 3. **降维可视化** 使用t-SNE进行二维降维 ```python from sklearn.manifold import TSNE import matplotlib.pyplot as plt features, labels = generate_latent_features() tsne = TSNE(n_components=2, random_state=42) features_2d = tsne.fit_transform(features) plt.figure(figsize=(10,8)) scatter = plt.scatter(features_2d[:,0], features_2d[:,1], c=labels.squeeze(), cmap='tab10', alpha=0.6) plt.colorbar(scatter) plt.title('CGAN Generated MNIST 2D Clustering') plt.show() ``` ### 四、效果优化建议 1. 在生成器网络中加入批量归一化层以提升稳定性 2. 使用标签平滑(label smoothing)技术防止判别器过拟合 3. 采用渐进式训练策略,从低分辨率图像开始逐步提升分辨率 4. 添加特征匹配损失(feature matching loss)约束生成分布 ### 典型输出结果 生成的二维聚类图将显示同数字类别在隐空间中的分布情况,理想情况下相同数字的样本点应聚集在相近区域,形成可区分的簇状结构[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值