wangmeili@ 2021-04-14 17:52 采纳率: 25%
浏览 136

TensorFlow训练CNN模型过程

遇到的问题:ValueError: Can't load save_path when it is None.

源码:

import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
import numpy as np
import cv2 as cv
import sys
import os
import random
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'       #设置警告等级

#定义卷积函数
def conv_layer(inputs,W,b,conv_strides,kernel_size,pool_strides,padding):
    L1_conv = tf.nn.conv2d(inputs,W,strides=conv_strides,padding=padding)                          #卷积操作
    L1_relu = tf.nn.relu(L1_conv + b)                                                                #激活函数RELU
    return tf.nn.max_pool(L1_relu,ksize=kernel_size,strides=pool_strides,padding='SAME')

#定义全连接函数
def full_connect(inputs,W,b):
    return tf.nn.relu(tf.matmul(inputs,W)+b)

#定义第一个预测函数
def predicts():
    PROVINCES = ("川","鄂","赣","甘","贵","桂","黑","沪","冀","津","京","吉","辽","鲁","蒙","闽","宁","青","琼","陕","苏","晋","皖","湘","新","豫","渝","粤","云","藏","浙")
    nProvinceIndex = 0
    SAVER_DIR = "./model_province/"
    #新建一个图
    g1 = tf.Graph()
    with g1.as_default():
        x = tf.placeholder(tf.float32,shape=[None,1024])             #None表示batch size的大小,这里可以是任何数,因为不知道待训练的图片数,SIZE指图片的大小
        y_ = tf.placeholder(tf.float32,shape=[None,31])     #输出标签的占位
        x_image = tf.reshape(x,[-1,32,32,1])                  #生成一个四维的数组
        sess1 = tf.Session(graph=g1)
        saver = tf.train.import_meta_graph("./model_province/model.ckpt.meta")
        #model_file = "%smodel.ckpt"%(SAVER_DIR)
        model_file = tf.train.latest_checkpoint(SAVER_DIR)  # 找出所有模型中最新的模型
        saver.restore(sess1, model_file)#恢复模型,相当于加载模型
        #第一个卷积层
        W_conv1 = sess1.graph.get_tensor_by_name("W_conv1:0")
        b_conv1 = sess1.graph.get_tensor_by_name("b_conv1:0")
        conv_strides = [1,1,1,1]
        kernel_size = [1,2,2,1]
        pool_strides = [1,2,2,1]
        L1_pool = conv_layer(x_image,W_conv1,b_conv1,conv_strides,kernel_size,pool_strides,padding='SAME')
        print("第一个卷积层")
        #第二个卷积层
        W_conv2 = sess1.graph.get_tensor_by_name("W_conv2:0")
        b_conv2 = sess1.graph.get_tensor_by_name("b_conv2:0")
        conv_strides = [1,1,1,1]
        kernel_size = [1,2,2,1]
        pool_strides = [1,2,2,1]
        L2_pool = conv_layer(L1_pool,W_conv2,b_conv2,conv_strides,kernel_size,pool_strides,padding='SAME')

        #全连接层
        W_fc1 = sess1.graph.get_tensor_by_name("W_fc1:0")
        b_fc1 = sess1.graph.get_tensor_by_name("b_fc1:0")
        h_pool2_flat = tf.reshape(L2_pool,[-1,8*8*24])
        h_fc1 = full_connect(h_pool2_flat,W_fc1,b_fc1)

        #dropout
        keep_prob = tf.placeholder(tf.float32)
        h_fc1_drop = tf.nn.dropout(h_fc1,keep_prob)

        #readout层
        W_fc2 = sess1.graph.get_tensor_by_name("W_fc2:0")
        b_fc2 = sess1.graph.get_tensor_by_name("b_fc2:0")

        #定义优化器和训练op
        conv = tf.nn.softmax(tf.matmul(h_fc1_drop,W_fc2) + b_fc2)

        for n in range(1,2):
            path = "./province-images-test/%s/" % (n)        #测试图的路径
            img = cv.imread(path,0)
            #cv.imshow('threshold',img)
            #cv.waitKey(0)
            height = img.shape[0]      #行数
            width = img.shape[1]       #列数

            img_data = [[0]*1024 for i in range(1)]          #创建一个数组,用于将输入的图片转换成数组形式
            for h in range(0,height):
                for w in range(0,width):
                    m = img[h][w]
                    if m > 150:
                        img_data[0][w+h*width] = 1
                    else:
                        img_data[0][w+h*width] = 0

            result = sess1.run(conv,feed_dict = {x:np.array(img_data),keep_prob:1.0})

            #用于输出概率最大的3类
            max1 = 0
            max2 = 0
            max3 = 0
            max1_index = 0
            max2_index = 0
            max3_index = 0
            for j in range(31):
                if result[0][j] > max1:
                    max1 = result[0][j]
                    max1_index = j
                    continue
                if (result[0][j]>max2) and (result[0][j]<=max1):
                    max2 = result[0][j]
                    max2_index = j
                    continue
                if (result[0][j]>max3) and (result[0][j]<=max2):
                    max3 = result[0][j]
                    max3_index = j
                    continue
            nProvinceIndex = max1_index      #最大概率的类
            print("概率:[%s %0.2f%%]    [%s %0.2f%%]    [%s %0.2f%%]" % (PROVINCES[max1_index],max1*100,PROVINCES[max2_index],max2*100,PROVINCES[max3_index],max3*100))

        print("省份简称是:%s" % PROVINCES[nProvinceIndex])
        return PROVINCES[nProvinceIndex],nProvinceIndex
        sess1.close()

#定义第二个预测函数
def predictn():
    LETTERS_DIGITS = ("A","B","C","D","E","F","G","H","J","K","L","M","N","P","Q","R","S","T","U","V","W","X","Y","Z","0","1","2","3","4","5","6","7","8","9")
    license_num = ""
    SAVER_DIR = "./model_letters/"
    print("进入调用")
    g2 = tf.Graph()
    with g2.as_default():
        x = tf.placeholder(tf.float32,shape=[None,1024])             #None表示batch size的大小,这里可以是任何数,因为不知道待训练的图片数,SIZE指图片的大小
        y_ = tf.placeholder(tf.float32,shape=[None,34])     #输出标签的占位
        x_image = tf.reshape(x,[-1,32,32,1])                  #生成一个四维的数组
        sess2 = tf.Session(graph=g2)
        saver = tf.train.import_meta_graph("./model_province/model.ckpt.meta")
        model_file = tf.train.latest_checkpoint(SAVER_DIR)      #找出所有模型中最新的模型
        saver.restore(sess2,model_file)
        #第一个卷积层
        W_conv1 = sess2.graph.get_tensor_by_name("W_conv1:0")
        b_conv1 = sess2.graph.get_tensor_by_name("b_conv1:0")
        conv_strides = [1,1,1,1]
        kernel_size = [1,2,2,1]
        pool_strides = [1,2,2,1]
        L1_pool = conv_layer(x_image,W_conv1,b_conv1,conv_strides,kernel_size,pool_strides,padding='SAME')
        #第二个卷积层
        W_conv2 = sess2.graph.get_tensor_by_name("W_conv2:0")
        b_conv2 = sess2.graph.get_tensor_by_name("b_conv2:0")
        conv_strides = [1,1,1,1]
        kernel_size = [1,2,2,1]
        pool_strides = [1,2,2,1]
        L2_pool = conv_layer(L1_pool,W_conv2,b_conv2,conv_strides,kernel_size,pool_strides,padding='SAME')
        #全连接层
        W_fc1 = sess2.graph.get_tensor_by_name("W_fc1:0")
        b_fc1 = sess2.graph.get_tensor_by_name("b_fc1:0")
        h_pool2_flat = tf.reshape(L2_pool,[-1,8*8*24])
        h_fc1 = full_connect(h_pool2_flat,W_fc1,b_fc1)
        #dropout
        keep_prob = tf.placeholder(tf.float32)
        h_fc1_drop = tf.nn.dropout(h_fc1,keep_prob)
        #readout层
        W_fc2 = sess2.graph.get_tensor_by_name("W_fc2:0")
        b_fc2 = sess2.graph.get_tensor_by_name("b_fc2:0")
        #定义优化器和训练op
        conv = tf.nn.softmax(tf.matmul(h_fc1_drop,W_fc2) + b_fc2)
        #想尝试将城市代码和车牌后五位一起识别,因此可以将3-8改为2-8
        for n in range(2,8):
            path = "./letter-images-test/%s/" % (n)
            img = cv.imread(path,0)
            height = img.shape[0]
            width = img.shape[1]
            img_data = [[0]*1024 for i in range(1)]
            for h in range(0,height):
                for w in range(0,width):
                    m = img[h][w]
                    if m > 150:
                        img_data[0][w+h*width] = 1
                    else:
                        img_data[0][w+h*width] = 0

            result = sess2.run(conv,feed_dict = {x:np.array(img_data),keep_prob:1.0})
            max1 = 0
            max2 = 0
            max3 = 0
            max1_index = 0
            max2_index = 0
            max3_index = 0
            for j in range(34):
                if result[0][j] > max1:
                    max1 = result[0][j]
                    max1_index = j
                    continue
                if (result[0][j]>max2) and (result[0][j]<=max1):
                    max2 = result[0][j]
                    max2_index = j
                    continue
                if (result[0][j]>max3) and (result[0][j]<=max2):
                    max3 = result[0][j]
                    max3_index = j
                    continue

            license_num = license_num + LETTERS_DIGITS[max1_index]
            print("概率:[%s %0.2f%%]    [%s %0.2f%%]    [%s %0.2f%%]" % (LETTERS_DIGITS[max1_index],max1*100,LETTERS_DIGITS[max2_index],max2*100,LETTERS_DIGITS[max3_index],max3*100))

        print("车牌编号是:%s" % license_num)
        return license_num
        sess2.close()

if __name__ == "__main__":
    a,b = predicts()
    c = predictn()
    print("车牌号为:" + a + c[0]+ "·" + c[1:6] )

附加运行截图,

恳请大佬解答,感激不尽!

 

  • 写回答

2条回答 默认 最新

  • 爱晚乏客游 2021-04-14 17:58
    关注

    报错那行的使用的路径不存在,看看是写错了还是文件名不对

    评论

报告相同问题?

悬赏问题

  • ¥15 模电中二极管,三极管和电容的应用
  • ¥15 关于模型导入UNITY的.FBX: Check external application preferences.警告。
  • ¥15 气象网格数据与卫星轨道数据如何匹配
  • ¥100 java ee ssm项目 悬赏,感兴趣直接联系我
  • ¥15 微软账户问题不小心注销了好像
  • ¥15 x264库中预测模式字IPM、运动向量差MVD、量化后的DCT系数的位置
  • ¥15 curl 命令调用正常,程序调用报 java.net.ConnectException: connection refused
  • ¥20 关于web前端如何播放二次加密m3u8视频的问题
  • ¥15 使用百度地图api 位置函数报错?
  • ¥15 metamask如何添加TRON自定义网络