西安科技大学牟琦python课程期中考试题答案

该文展示了使用Tensorflow和numpy对FashionMNIST数据集进行数据增强的过程,包括图片的转置、翻转、旋转等操作,以及如何保存和读取处理后的图片数据。此外,还讨论了图像缩放的处理方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

注:非标准答案!是我自己做了两天,查了各种资料做出来的。可能有更好的方法。所以仅供和我一样的学习者参考。喷子的话,就另谋高就。

第1题

import tensorflow as tf 
import matplotlib.pyplot as plt 
import numpy as np
from PIL import Image

# import warnings
# warnings.filterwarnings("ignore", category=Warning)

plt.rcParams['font.family']='KaiTi'

fashion_mnist = tf.keras.datasets.fashion_mnist
(train_x,train_y),(test_x,test_y)=fashion_mnist.load_data()

#查看训练集和数据集的样本数、形状、标签值。
# print('training set:',len(train_x))
# print('testing set:',len(test_x))

# print('Shape of train_x:',train_x.shape)
# print('Shape of train_y:',train_y.shape)

# print(train_y)

#提取索引值0、8的图片
# plt.figure(figsize=(6,3))

# plt.subplot(121)
# plt.axis('off')
# plt.imshow(train_x[0])
# plt.title(train_y[i],fontsize=12)

# plt.subplot(122)
# plt.axis('off')
# plt.imshow(train_x[8])
# plt.title(train_y[i],fontsize=12)

# plt.show()

# print(train_x[0])

#对第一张图片进行隔行采样。

# c2=np.array(train_x[0])
# c2[0:28:2,::]=0

# plt.figure(figsize=(6,3))

# plt.subplot(121)
# plt.axis('off')
# plt.imshow(train_x[0])
# plt.title(str(train_y[0])+' 原图',fontsize=12)

# plt.subplot(122)
# plt.axis('off')
# plt.imshow(c2)
# plt.title(str(train_y[0])+' 隔两行采样图',fontsize=12)

# plt.show()

#对前10张图片进行转置、上下翻转、水平镜像、
#顺时针旋转10度、逆时针旋转10度,
#将图片数量由10张增加到60张,并将处理后的图片
#保存在多维数组train_x_aug1中。
a_0=np.array(train_x[0:10])
a_trans=np.transpose(a_0,(0,2,1))
a_flip_h=a_0[:,-1::-1,:]
a_flip_v=a_0[:,:,-1::-1]
a_rr10=np.ones((10,28,28),dtype=np.int8)
a_rl10=np.ones((10,28,28),dtype=np.int8)
for i in range(10):
    a_image=Image.fromarray(a_0[i])
    a_rr10[i]=np.array(a_image.rotate(-10))
for i in range(10):
    a_image=Image.fromarray(a_0[i])
    a_rl10[i]=np.array(a_image.rotate(10)) 

train_x_aug1=np.zeros((6,10,28,28),dtype=np.int8)
train_x_aug1[0]=a_0
train_x_aug1[1]=a_trans
train_x_aug1[2]=a_flip_h
train_x_aug1[3]=a_flip_v
train_x_aug1[4]=a_rr10
train_x_aug1[5]=a_rl10

plt.figure(figsize=(18,30))

titles=['原图','转置','上下翻转','水平镜像','顺时针旋转10°','逆时针旋转10度']

for i in range(10):
    for j in range(6):
        plt.subplot(10,6,i*6+j+1)
        plt.axis('off')
        plt.imshow(train_x_aug1[j][i])
        if i==0:
            plt.title(titles[j],fontsize=10)

plt.suptitle('Fashion MNIST数据增强',fontsize=12)
plt.show()

# (1) 选取训练集中前10张图片,对每张图片进行2次旋转操作,
# 旋转方向和角度随机,将结果保存在多维数组train_x_aug2中,并以清晰、美观的形式展示结果。

#randint1=random.randint(-180,180)
#randint2=random.randint(-180,180)
#a_r_r1=np.ones([10,28,28],dtype=np.int8)
#a_r_r2=np.ones([10,28,28],dtype=np.int8)

#for i in range(10):
#    a_image=Image.fromarray(train_x[i])
#    a_r_r1[i]=np.array(a_image.rotate(randint1))
#    a_r_r2[i]=np.array(a_image.rotate(randint2))

#train_x_aug2=np.stack((train_x[0:10],a_r_r1,a_r_r2),axis=0)

#plt.figure(figsize=(9,30))
#titles=['原图','随机旋转1','随机旋转2']


#for i in range(10):
#    for j in range(3):
#        plt.subplot(10,3,i*3+j+1)
#        plt.axis('off')
#        plt.imshow(train_x_aug2[j][i])
#        if(i==0):
#            plt.title(titles[j],fontsize=10)

#plt.show()

# (2) 选取训练集中的前100张图片,对每张图片实现3种
# 随机变换(转置、翻转、镜像、旋转等),并将结果保存在
# 多维数组train_x_aug3中。随机选择其中的10张原图,把变换的结果展示出来。

#def trans(arr):
#    a_trans=np.transpose(arr,(0,2,1))
#    return a_trans
#def flip_h(arr):
#    a_flip_h=arr[:,-1::-1,:]
#    return a_flip_h
#def flip_v(arr):
#    a_flip_v=arr[:,:,-1::-1]
#    return a_flip_v
#def rotate(arr):
#    a_r_r=np.ones([100,28,28],dtype=np.int8)
#    for i in range(100):
#        a_image=Image.fromarray(arr[i])
#        a_r_r=np.array(a_image.rotate(random.randint(-180,180)))
#    return a_r_r

#train_x_aug3=np.ones([4,100,28,28],dtype=np.int8)
#train_x_aug3[0]=train_x[0:100]

#func=[0,1,2,3]
#for i in range(3):
#    num=random.choice(func)
    #print(num)
#    func.remove(num)
#    if num==0:train_x_aug3[i+1]=trans(train_x_aug3[i])
#    elif num==1:train_x_aug3[i+1]=flip_h(train_x_aug3[i])
#    elif num==2:train_x_aug3[i+1]=flip_v(train_x_aug3[i])
#    else:train_x_aug3[i+1]=rotate(train_x_aug3[i])

#plt.figure(figsize=(12,30))
#titles=['随机原图','一次随机变换','二次随机变换(叠加前一次)','三次随机变换(叠加前两次']

#for i in range(10):
#    m=random.randint(0,100)
#    for j in range(4):
#        plt.subplot(10,4,i*4+j+1)
#        plt.axis('off')
#        plt.imshow(train_x_aug3[j][m])
#        if(i==0):
#            plt.title(titles[j],fontsize=10)

#plt.show()

#(3)对图片进行缩放时,图片的像素会改变,要求对图片分别缩小10%、
#放大10%,缩放后图片尺寸仍保持28×28,应该怎么做?(2分  

a_image=Image.fromarray(train_x[0])
a_res=np.array(a_image.resize((25,25)))
a_res2=np.ones([28,28],dtype=np.int8)
a_res2[1:26,2:27]=a_res
#print(train_x[0].shape)
#print(a_res2.shape)

a_cro=a_image.crop((1,2,26,27))
#print(a_cro.size)
a_cro2=np.array(a_cro.resize((28,28)))

train_x_aug4=np.stack((train_x[0],a_res2,a_cro2),axis=0)
titles=['原图','缩小10%','放大10%']
plt.figure(figsize=(9,3))
for i in range(len(train_x_aug4)):
    plt.subplot(1,3,i+1)
    plt.axis('off')
    plt.imshow(train_x_aug4[i])
    plt.title(titles[i],fontsize=15)

plt.show()


第2题

import matplotlib.pyplot as plt
import pandas as pd 
from PIL import Image 
import numpy as np 

# a_arr=np.ones([10,28,28],dtype=np.int8)
# a_arr_rev=np.ones([10,28,28],dtype=np.int8)
# for i in range(10):
#     a_image=Image.open('F:/selfdata/digital1(Paint)/'+str(i)+'.png')
#     a_image2=a_image.convert(mode='1')
#     a_image3=a_image2.resize((28,28))
#     a_arr[i]=np.array(a_image3)
#     a_arr_rev[i]=255-a_arr[i]

# plt.figure(figsize=(25,10))
# for i in range(10):
#     plt.subplot(2,5,i+1)
#     plt.axis('off')
#     plt.imshow(a_arr_rev[i])

#plt.show()

#将包含10张图片的数据保存在npy文件中,可以直接用load方法读出数据。
#np.save('F:/selfdata/digital1(Paint)/digital_1',a_arr_rev,'csv')
# b_arr=np.load('F:/selfdata/digital1(Paint)/digital_1.npy')
#print(b_arr.shape)

#将包含10张图片的数据降维,保存在csv文件中。
# c_arr=a_arr_rev.reshape(-1,28)
#print(c_arr.shape)
#从csv文件中读出数据,并显示出图片。
#np.savetxt('F:/selfdata/digital1(Paint)/digital_1.csv',c_arr,'%d')
d_arr=np.loadtxt('F:/selfdata/digital1(Paint)/digital_1.csv')
# print(d_arr.shape)
e_arr=d_arr.reshape(10,28,28)

plt.figure(figsize=(25,10))
for i in range(10):
    plt.subplot(2,5,i+1)
    plt.axis('off')
    plt.imshow(e_arr[i])

plt.show()

#纸上手写数字拍照操作同上,只要将路径改为F:/selfdata/digital1(paper)/'+str(i)+'.png'

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值