import tensorflow as tf import matplotlib .pyplot as plt from PIL import Image import numpy as np import os from myResNet import resnet35 # 设置相关底层配置 physical_devices = tf.config.experimental.list_physical_devices(‘GPU‘) assert len(physical_devices) > 0, "Not enough GPU hardware devices available" tf.config.experimental.set_memory_growth(physical_devices[0], True) size = 100 mybatch = 30 # l_rate = 5e-7 load_name = 1e-9 l_rate = 1e-9 ep = 500 img_shape = (1,size,size,3) each_shape = (size,size) model_shape = (None,size, size, 3) def getdata(): img_path = ‘D:\深度学习\my_imgtest\myimg‘ x_shape = img_shape x_np = np.zeros(shape=x_shape) y_shape = (1,1) y_np = np.zeros(shape=y_shape) y_flag = [‘cui‘,‘ma‘,‘mei‘,‘po‘,‘yi‘] for each_person in os.listdir(img_path): person_imgs_path = os.path.join(img_path,each_person) # print(person_imgs_path) # 确定y标签 flag = person_imgs_path.split(‘\\‘)[-1] flag = flag.split(‘_‘)[0] # print(flag) flag_index = y_flag.index(flag)+1 # print(flag_index) for _,_,imgs_name in os.walk(person_imgs_path): for each_img_name in imgs_name: each_img = os.path.join(person_imgs_path,each_img_name) img1 = Image.open(each_img) img1 = img1.resize(each_shape) img_np = np.array(img1) # print(img_np) # print(img_np.shape) if np.max(x_np[0]) == 0: # print(‘第一个是0‘) x_np[0] = img_np # print(‘[flag_index]‘, [flag_index]) # print(‘y_np:‘, y_np) y_np[0] = [flag_index] continue x_np = np.insert(x_np,0,img_np,axis=0) y_np = np.insert(y_np,0,flag_index,axis=0) # print(‘x_np:‘, x_np) # break print(‘读取图片成功!!‘) # print(‘x_np.shape:‘,x_np.shape) # print(‘y_np.shape‘,y_np.shape) # x_np.dtype = ‘int32‘ return x_np,y_np def preprocess(x,y): x = tf.cast(x,dtype=tf.float32) / 255 y = tf.cast(y,dtype=tf.int32) return x,y if __name__ == ‘__main__‘: x,y = getdata() # # 画图 # for i in range(x.shape[0]): # if i != 14 : # continue # print(x[i].shape) # plt.imshow(x[i].astype(‘int32‘)) # y_flag = [‘cui‘, ‘ma‘, ‘mei‘, ‘po‘, ‘yi‘] # print(‘y[i]:‘,y[i][0]) # name = y_flag[int(y[i][0])-1] # plt.title(name) # plt.show() # 识别训练 y = tf.squeeze(y, axis=1) print(x.shape,y.shape) train_db = tf.data.Dataset.from_tensor_slices((x, y)) train_db = train_db.map(preprocess).shuffle(30).batch(mybatch) # 打印看下数据的形状 sample = next(iter(train_db)) print(‘sample:‘, sample[0].shape, sample[1].shape , tf.reduce_min(sample[0]), tf.reduce_max(sample[0])) model = resnet35() model.build(input_shape=model_shape) # 定义优化器 optimizer = tf.optimizers.Adam(lr=l_rate) # 加载参数 load_path = os.path.join(‘D:\深度学习\my_imgtest\model_save‘,str(load_name)) model.load_weights(load_path) # 训练 for epoch in range(ep): for step, (x, y) in enumerate(train_db): with tf.GradientTape() as tape: # print(‘x.shape:‘,x.shape) logits = model(x) # y_onehot = tf.one_hot(y, depth=5) loss = tf.losses.categorical_crossentropy(y_onehot, logits, from_logits=True) loss = tf.reduce_mean(loss) grads = tape.gradient(loss, model.trainable_variables) if loss > 10: print(‘grads:‘,grads) break break optimizer.apply_gradients(zip(grads, model.trainable_variables)) if step % 100 == 0: print(epoch, step, ‘loss:‘, float(loss)) for x, y in train_db: # print() logits = model(x) prob = tf.nn.softmax(logits, axis=1) pred = tf.argmax(prob, axis=1) pred = tf.cast(pred, tf.int32) correct = tf.cast(tf.equal(pred, y), dtype=tf.int32) correct = tf.reduce_mean(tf.cast(correct, dtype=tf.float32)) print(‘acc:‘, float(correct)) save_path = ‘D:\深度学习\my_imgtest\model_save‘ save_path = os.path.join(save_path,str(l_rate)) model.save_weights(save_path)