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