From bc106bcd5eae89dd605586c97a0300899e408b29 Mon Sep 17 00:00:00 2001 From: 123456 <123456> Date: Sun, 10 Sep 2023 22:40:57 +0800 Subject: [PATCH] update --- src/medicine/train_cancer/.idea/.gitignore | 8 + .../inspectionProfiles/profiles_settings.xml | 6 + src/medicine/train_cancer/.idea/misc.xml | 4 + src/medicine/train_cancer/.idea/modules.xml | 8 + .../train_cancer/.idea/train_cancer.iml | 8 + src/medicine/train_cancer/README.md | 49 + .../__pycache__/data_loader.cpython-311.pyc | Bin 0 -> 4876 bytes .../data_single_loader.cpython-311.pyc | Bin 0 -> 917 bytes .../loader_picture/change_file.py | 10 + .../loader_picture/data_loader.py | 83 ++ .../loader_picture/data_single_loader.py | 11 + src/medicine/train_cancer/out.txt | 4 + src/medicine/train_cancer/test.py | 16 + .../train_model_and_load_picture.py | 30 + src/medicine/train_cancer/test_res.txt | 647 ++++++++++++ .../__pycache__/data_output.cpython-311.pyc | Bin 0 -> 837 bytes .../train_model/data_gen/data_output.py | 23 + .../train_model/gpu_cpu/check_cpu.py | 10 + .../__pycache__/modeling.cpython-311.pyc | Bin 0 -> 2168 bytes .../reduce_study_rate.cpython-311.pyc | Bin 0 -> 1135 bytes .../train_model/modeling/modeling.py | 45 + .../train_model/modeling/reduce_study_rate.py | 24 + .../train_cancer/train_model/test/predict.py | 24 + .../train_cancer/train_model/train/train.py | 30 + src/medicine/train_cancer/train_test.ipynb | 981 ++++++++++++++++++ src/medicine/train_cancer/思路整理.md | 49 + 26 files changed, 2070 insertions(+) create mode 100644 src/medicine/train_cancer/.idea/.gitignore create mode 100644 src/medicine/train_cancer/.idea/inspectionProfiles/profiles_settings.xml create mode 100644 src/medicine/train_cancer/.idea/misc.xml create mode 100644 src/medicine/train_cancer/.idea/modules.xml create mode 100644 src/medicine/train_cancer/.idea/train_cancer.iml create mode 100644 src/medicine/train_cancer/README.md create mode 100644 src/medicine/train_cancer/loader_picture/__pycache__/data_loader.cpython-311.pyc create mode 100644 src/medicine/train_cancer/loader_picture/__pycache__/data_single_loader.cpython-311.pyc create mode 100644 src/medicine/train_cancer/loader_picture/change_file.py create mode 100644 src/medicine/train_cancer/loader_picture/data_loader.py create mode 100644 src/medicine/train_cancer/loader_picture/data_single_loader.py create mode 100644 src/medicine/train_cancer/out.txt create mode 100644 src/medicine/train_cancer/test.py create mode 100644 src/medicine/train_cancer/test_information/train_model_and_load_picture.py create mode 100644 src/medicine/train_cancer/test_res.txt create mode 100644 src/medicine/train_cancer/train_model/data_gen/__pycache__/data_output.cpython-311.pyc create mode 100644 src/medicine/train_cancer/train_model/data_gen/data_output.py create mode 100644 src/medicine/train_cancer/train_model/gpu_cpu/check_cpu.py create mode 100644 src/medicine/train_cancer/train_model/modeling/__pycache__/modeling.cpython-311.pyc create mode 100644 src/medicine/train_cancer/train_model/modeling/__pycache__/reduce_study_rate.cpython-311.pyc create mode 100644 src/medicine/train_cancer/train_model/modeling/modeling.py create mode 100644 src/medicine/train_cancer/train_model/modeling/reduce_study_rate.py create mode 100644 src/medicine/train_cancer/train_model/test/predict.py create mode 100644 src/medicine/train_cancer/train_model/train/train.py create mode 100644 src/medicine/train_cancer/train_test.ipynb create mode 100644 src/medicine/train_cancer/思路整理.md diff --git a/src/medicine/train_cancer/.idea/.gitignore b/src/medicine/train_cancer/.idea/.gitignore new file mode 100644 index 00000000..13566b81 --- /dev/null +++ b/src/medicine/train_cancer/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/src/medicine/train_cancer/.idea/inspectionProfiles/profiles_settings.xml b/src/medicine/train_cancer/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 00000000..105ce2da --- /dev/null +++ b/src/medicine/train_cancer/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/src/medicine/train_cancer/.idea/misc.xml b/src/medicine/train_cancer/.idea/misc.xml new file mode 100644 index 00000000..d4b107a8 --- /dev/null +++ b/src/medicine/train_cancer/.idea/misc.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/src/medicine/train_cancer/.idea/modules.xml b/src/medicine/train_cancer/.idea/modules.xml new file mode 100644 index 00000000..2d35dc8f --- /dev/null +++ b/src/medicine/train_cancer/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/src/medicine/train_cancer/.idea/train_cancer.iml b/src/medicine/train_cancer/.idea/train_cancer.iml new file mode 100644 index 00000000..d0876a78 --- /dev/null +++ b/src/medicine/train_cancer/.idea/train_cancer.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/src/medicine/train_cancer/README.md b/src/medicine/train_cancer/README.md new file mode 100644 index 00000000..e31614eb --- /dev/null +++ b/src/medicine/train_cancer/README.md @@ -0,0 +1,49 @@ +#### *第一步、搜集数据集* + +- *文件保存在picture文件夹中* + - *benign 良性乳腺癌图片* + - *malignant 恶性乳腺癌图片* + - *normal 正常乳腺癌图片* +- *以70%作为训练集、30%作为测试集* + +#### *第二步、处理数据集* + +- *(1) 读取图片* +- *(2) 使用sklearn.model_selection中的train_test_split 分割数据集* +- *(3) 使用plt打印图片* + +#### *第三步训练* +- *训练模型选择* + - *使用Microsoft提出的DenseNet201框架进行训练* + - *DenseNet201包含201层卷积层和全连接层* + - *拥有池化操作,非常适合训练模型* + +- *激活函数选择* + - *使用softmax作为激活函数* + + - $$ + Softmax(z_{i} )=\frac{e^{z_{i}}}{ {\textstyle \sum_{c=1}^{c} e^{z_{c}}}} + 其中zi为第i个节点的输出值,c为输出节点的个数 + $$ + +- *损失函数选择* + + - *使用二元交叉熵给出* + + - $$ + Loss = \frac{1}{N} \sum_{i=1}^{N}[y_{i}log(p(y_{i})) + (1-y_{i})(1 - log(p(y_{i})))] + $$ + +- *优化器选择* + + - *Nadam优化器* + - *该优化器综合Adam将RMSprop和动量结合起来* + - *优于Adam优化器* + +#### *第四步*测试 + +- *导入图片* + - *使用PIL进行读取图片* + - *使用test pic进行测试* + - *tensorflow load_model进行模型的加载* + - *predict进行模型的预测* \ No newline at end of file diff --git a/src/medicine/train_cancer/loader_picture/__pycache__/data_loader.cpython-311.pyc b/src/medicine/train_cancer/loader_picture/__pycache__/data_loader.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e5d57c69897a62ceb00f80ffa9f9ebb720685264 GIT binary patch literal 4876 zcmc&1TTC0-^^V^*1{_H25ZD9~8!$%^$1mO6`92+%a?QA)svf z)9dk>d(XM&-1E3|&$(YzR=NkQ5dllYvQRerM*pI zllC@;E$}w;*0?Qfql$CvVF%zWyff|!yEL4YuZX+DZVH)DA7X6}5o>>HLg*R%i!EHq znr@m}wJ3{tAKKhBJB z(5aG=bcB((k)#lfFg##9lE6e0w8V)LEspU~DNvOk5Vq3ww~u>wiN7kfym*;A)l9ShvV z{@6hs%UbI6E;9NnO-Y0TQ9Ps%vR=Jc{!URwZVK;lvR;ZRtpX7(;Zclua@QP!H~8iM zX$^_gE=@~#6eBU%HHYA(j*{2FL&QqfYCI9aON6$IhsfH4htQlzI%8OAPoJ|k*8ZjA zDSR`}$agaYJy@Lt4Ei|vXbt-HW&H-d&mzb{&cT_^-X9N*2}wFROv7tLVB$m9r=`(k zVyKwqB1|H}2}5Jih%_#6LwC7EbR_X|6U5APza49w;enM&NCHk?FEJST>@jYCzxWcL zI6;%@EGAV*%c@&o5^OR~ixMQ?;5(`*F{WA>L13oU3YL)=n%AMp88YwD`iWR)F6 zRT%;jwpyW2#{=sOCnQDH%yS8~Mki>=ooDWHym~;#;Z$ElS&|7(R1cL&Et`L^3|(TW zh$IuZf=Iw$wNLFRW}n{a*Z_l-u>nGRGhq1$r&`5PW{gv9ML(!^addomnCAo>b^)JH zs;d|x2;G$Gm|%Du#HljuG{H`TZ!IFn537_YV$U}=et+eMg|FylTHgR=u5TZM1!y{& zh)Og)Q(dfP+I0l}7Q_iyYZh%a99{k}dut=mwI1loy>~w+PRM~tB`_&BOeqaha~8!> zS2)(RJhf`sXg#;ydMK~(_?7GpE8Z}sft8ij^Zg5KhF83;s|OVCN!fi$ zai5x_3J%x2bHh=$?xj#+A5Kf5e{POE~-r;B??e&Mrtp*^I6(1 zk(D5AlhPwg3KCrp{7z9RYsyZ}dSpyOX~#aY$}}uVOF4|%q@AoOq1IhXch^lVXA7S znXacekzUivw$i%yl zk~n;GR&C4}n8a$v3bp3yJB<rx21%~KgPhbRkO2%5EHkbJ;}>VaDA2{0il#MDL)sJ zJl}L#O84A7lZJ4m*a|p%^>Tgnam}Zm=IvXbOOt!B9ExwViI%hhz^>L#t(9x+U+ z`Ia6ws97^eNVLFm>$a(lmX`eH<$TE|&P#(-_V4iIxL~Pddpfa$3IwC&dFUM60~4c@ z?c?fu`80iAc$YcNd{LJ_tIMCvu3GA;rEad=%avm^gi81wD1UP%C#PbfzE@;()C{bB z6HY7|7G)BjFo~MPV3JS5T_##iJ>V~+a-r8afbthLdJ8ffHYkCKQC}%{lybb x_train + train_target => y_ train + test_size 样本占比:测试集占总体样本 测试集和训练集3/7分 85% + test_size 样本占比:测试集占总体样本 测试集和训练集2/8分 89% + random_state 随机种子 + ''' + self.train_of_x , self.val_of_x , self.train_of_y , self.val_of_y = train_test_split( + self.x_train , self.y_train, + # test_size=0.3, + test_size=0.2, + random_state=11 + ) + + def data_loader(self, dir, size): + IMG = [] # 图片 + # 打开该路径下的图像文件转换为RGB模式并返回numpy数组 + read = lambda i: np.asarray(Image.open(i).convert("RGB")) + home_dir = sorted(os.listdir(dir)) + n = len(home_dir) + for i in range(n): + # 获取图片路径 + path = os.path.join(dir, home_dir[i]) + l = os.path.split(path) + + if "_mask" not in l[1]: + # 正常png图片 + img = read(path) + # + # 需要resize缩放为224x224 + img = cv2.resize(img, (size, size)) + IMG.append(np.array(img)) + return IMG \ No newline at end of file diff --git a/src/medicine/train_cancer/loader_picture/data_single_loader.py b/src/medicine/train_cancer/loader_picture/data_single_loader.py new file mode 100644 index 00000000..f2faf696 --- /dev/null +++ b/src/medicine/train_cancer/loader_picture/data_single_loader.py @@ -0,0 +1,11 @@ +import cv2 +from PIL import Image + +import numpy as np + + +def load_single(dir , size): + read = lambda i: np.asarray(Image.open(i).convert("RGB")) + path = dir + img = read(path) + return np.array(cv2.resize(img, (size, size))) \ No newline at end of file diff --git a/src/medicine/train_cancer/out.txt b/src/medicine/train_cancer/out.txt new file mode 100644 index 00000000..7c37571c --- /dev/null +++ b/src/medicine/train_cancer/out.txt @@ -0,0 +1,4 @@ +node { + input: "root" + device: "_tf_keras_sequential" +} diff --git a/src/medicine/train_cancer/test.py b/src/medicine/train_cancer/test.py new file mode 100644 index 00000000..6e40faa3 --- /dev/null +++ b/src/medicine/train_cancer/test.py @@ -0,0 +1,16 @@ +def check(dir_pic , dir_model): + import numpy as np + from loader_picture import data_single_loader + import tensorflow as tf + + pic_test = dir_pic + # 转换为numpy格式 + img_test = data_single_loader.load_single(pic_test , 224) + # 需要(1,224,224,3)这种格式输入 + img_test = np.expand_dims(img_test , axis=0) + + # 载入模型 + x = tf.keras.models.load_model(dir_model) + res = x.predict(img_test) + np.set_printoptions(suppress=True) + return "良性:" + str(res[0][0]) + "恶性:" + str(res[0][1]) \ No newline at end of file diff --git a/src/medicine/train_cancer/test_information/train_model_and_load_picture.py b/src/medicine/train_cancer/test_information/train_model_and_load_picture.py new file mode 100644 index 00000000..ffa53e32 --- /dev/null +++ b/src/medicine/train_cancer/test_information/train_model_and_load_picture.py @@ -0,0 +1,30 @@ +from loader_picture import data_loader +import numpy as np +from matplotlib import pyplot as plt + +from train_model.modeling import reduce_study_rate +from train_model.modeling import modeling +from train_model.data_gen import data_output + +# 载入图片 +load = data_loader.Loader() +# 获取模型 +models = modeling.breast_train_test() +# 展现模型 +models.model.summary() +# data +data = data_output.gen_data() + +# 降低学习率 +reduces = reduce_study_rate.reduce() +reduces.train() + +# 训练+评估 +history = models.model.fit( + data.tr_gen.flow(load.train_of_x , load.train_of_y , batch_size=data.batch), + steps_per_epoch = load.train_of_x.shape[0] / data.batch, + # 训练20次 + epochs=20, + validation_data=(load.val_of_x , load.val_of_y), + callbacks=[reduces.learn_control , reduces.checkpoint] +) \ No newline at end of file diff --git a/src/medicine/train_cancer/test_res.txt b/src/medicine/train_cancer/test_res.txt new file mode 100644 index 00000000..cc45b1d9 --- /dev/null +++ b/src/medicine/train_cancer/test_res.txt @@ -0,0 +1,647 @@ +6.092087723175155e-09 1.0 +0.9989112615585327 0.001088793040253222 +0.9935709238052368 0.006429135799407959 +0.9997281432151794 0.00027184083592146635 +3.0335837436723523e-05 0.9999697208404541 +0.999747097492218 0.0002529561170376837 +0.008596532978117466 0.9914035201072693 +0.999934196472168 6.57897544442676e-05 +0.9989705085754395 0.0010294488165527582 +0.5978875756263733 0.4021124839782715 +3.6031291529070586e-05 0.9999639987945557 +3.7862635053897975e-06 0.9999961853027344 +0.9993938207626343 0.0006061863387003541 +8.81914729689015e-06 0.9999911785125732 +0.3917083740234375 0.6082916259765625 +0.9998810291290283 0.00011889902816619724 +0.6820005178451538 0.3179994821548462 +0.9987319111824036 0.0012680714717134833 +0.00011924829595955089 0.9998807907104492 +0.9993540644645691 0.0006459243595600128 +0.9996631145477295 0.0003369428450241685 +0.48353785276412964 0.5164620876312256 +3.497324087220477e-06 0.999996542930603 +0.9905140399932861 0.009485905058681965 +0.9999887943267822 1.1235452802793588e-05 +0.04187602177262306 0.9581239223480225 +0.9910897016525269 0.008910246193408966 +0.999971866607666 2.8184229449834675e-05 +0.9999890327453613 1.0908943295362405e-05 +0.8602142333984375 0.1397857666015625 +0.9999949932098389 5.041587883169996e-06 +0.9978411197662354 0.002158836927264929 +0.6723547577857971 0.3276452124118805 +0.9998103976249695 0.00018961272144224495 +0.9999525547027588 4.740445001516491e-05 +1.4190926833634876e-07 0.9999998807907104 +0.7048918008804321 0.29510819911956787 +1.4167305835144361e-06 0.9999985694885254 +0.00013711843348573893 0.9998629093170166 +0.9996042847633362 0.00039568531792610884 +0.7229845523834229 0.2770155072212219 +0.999221682548523 0.000778281013481319 +0.00015150148828979582 0.999848484992981 +0.9998829364776611 0.00011702731717377901 +0.7218467593193054 0.2781532406806946 +0.15666170418262482 0.8433382511138916 +0.9998588562011719 0.0001410984550602734 +0.7082615494728088 0.29173845052719116 +0.02286633290350437 0.9771337509155273 +0.1373814195394516 0.8626185059547424 +0.8673439621925354 0.13265608251094818 +0.9999347925186157 6.523412594106048e-05 +0.00019901152700185776 0.999800980091095 +0.9999953508377075 4.663339950639056e-06 +0.9997709393501282 0.00022907997481524944 +0.9986693859100342 0.001330674858763814 +0.353473961353302 0.646526038646698 +0.003105917014181614 0.996894121170044 +0.9999948740005493 5.0977191676793154e-06 +0.9999982118606567 1.7473138314016978e-06 +0.9951081871986389 0.004891766235232353 +0.9999829530715942 1.6995192709146068e-05 +0.9996659755706787 0.0003340912808198482 +3.4974067375515006e-07 0.9999996423721313 +0.0729290321469307 0.9270709753036499 +0.9704300761222839 0.029569925740361214 +1.4645347157227206e-09 1.0 +3.1297126952267718e-06 0.9999969005584717 +0.6081261038780212 0.39187392592430115 +0.44829297065734863 0.5517070293426514 +0.7791184186935425 0.2208816111087799 +0.7523340582847595 0.24766597151756287 +0.025663873180747032 0.9743360877037048 +0.9983474016189575 0.0016525561222806573 +0.9999810457229614 1.8939881556434557e-05 +0.9934049248695374 0.006595127750188112 +0.9381039142608643 0.061896029859781265 +0.9972034692764282 0.002796591492369771 +0.002707625972107053 0.9972923398017883 +1.0068716619571205e-05 0.9999899864196777 +0.9999748468399048 2.5135010218946263e-05 +0.9998923540115356 0.00010767456114990637 +0.21499860286712646 0.7850013971328735 +0.9999240636825562 7.588239532196894e-05 +7.526091962972714e-07 0.9999992847442627 +0.9973554611206055 0.0026445514522492886 +0.00015752170293126255 0.9998424053192139 +0.0067070042714476585 0.993293046951294 +0.005396672990173101 0.9946033358573914 +0.9996371269226074 0.000362917227903381 +0.9676159620285034 0.03238402307033539 +0.9100929498672485 0.08990702033042908 +0.8950210213661194 0.10497894883155823 +0.22162331640720367 0.7783766984939575 +0.36174920201301575 0.6382507681846619 +0.999675989151001 0.0003239802608732134 +0.8803484439849854 0.11965155601501465 +0.9999208450317383 7.915231253718957e-05 +0.9998499155044556 0.0001500368380220607 +0.8224522471427917 0.17754776775836945 +0.9999898672103882 1.0138361176359467e-05 +0.9995653033256531 0.0004346343921497464 +0.9999706745147705 2.9308854209375568e-05 +0.9904494881629944 0.009550555609166622 +0.5672293305397034 0.43277063965797424 +0.9821467995643616 0.01785319484770298 +0.9999518394470215 4.8160614824155346e-05 +2.017002458387651e-07 0.9999997615814209 +0.9127623438835144 0.08723766356706619 +0.9998904466629028 0.00010953448509098962 +0.9998772144317627 0.0001228056789841503 +0.9999266862869263 7.326720515266061e-05 +1.6869115881945618e-08 1.0 +0.11213619261980057 0.8878637552261353 +0.9999957084655762 4.337792688602349e-06 +0.751361072063446 0.24863891303539276 +0.9999035596847534 9.643758676247671e-05 +1.7767119686595834e-07 0.9999998807907104 +0.9999873638153076 1.2616713320312556e-05 +0.999969482421875 3.0498564228764735e-05 +0.9956398010253906 0.004360210616141558 +0.6791333556175232 0.32086658477783203 +0.5872390866279602 0.412760853767395 +8.371390691763736e-09 1.0 +0.9992006421089172 0.0007993809995241463 +0.9999994039535522 5.464415266942524e-07 +2.5259971607738407e-06 0.9999974966049194 +0.0002582882298156619 0.9997417330741882 +0.8582680225372314 0.14173197746276855 +0.8277018666267395 0.1722981035709381 +0.0014999492559581995 0.9985001087188721 +0.9972853660583496 0.002714633010327816 +0.9923239946365356 0.007676038425415754 +0.26004090905189514 0.7399591207504272 +0.9973554611206055 0.002644606865942478 +0.9820063710212708 0.017993640154600143 +0.4168517291545868 0.5831482410430908 +0.9994215965270996 0.0005783918313682079 +0.00042614186531864107 0.9995738863945007 +0.9971297383308411 0.002870315220206976 +0.9999992847442627 7.468157150469779e-07 +0.9985871315002441 0.0014128603506833315 +0.9996757507324219 0.00032424350501969457 +0.6582497954368591 0.3417501747608185 +0.9576846361160278 0.04231531545519829 +4.166609505773522e-05 0.9999582767486572 +1.7872223452286562e-06 0.9999982118606567 +0.9824076294898987 0.01759237051010132 +0.4607923626899719 0.5392076969146729 +0.9996966123580933 0.0003033890388906002 +9.082500037038699e-05 0.9999091625213623 +0.9999431371688843 5.6826243962859735e-05 +0.5971385836601257 0.4028613269329071 +0.9952648878097534 0.004735115449875593 +0.9955756664276123 0.004424356389790773 +0.9168573021888733 0.08314268290996552 +0.9162992835044861 0.08370067924261093 +0.6812700033187866 0.31873002648353577 +0.08008529990911484 0.9199146628379822 +0.9923356175422668 0.007664340082556009 +0.9992988109588623 0.0007011212292127311 +3.826002739515388e-06 0.9999961853027344 +0.997008740901947 0.002991274232044816 +0.9996020197868347 0.00039801234379410744 +0.9995643496513367 0.00043558195466175675 +0.9841747879981995 0.015825193375349045 +0.31447848677635193 0.6855215430259705 +0.9996471405029297 0.00035283094621263444 +0.9999393224716187 6.067020513000898e-05 +0.9979230761528015 0.00207689986564219 +0.9967340230941772 0.0032659852877259254 +0.9981361627578735 0.0018637717003002763 +0.16870082914829254 0.8312992453575134 +0.9999783039093018 2.1755000489065424e-05 +0.4760817289352417 0.5239183306694031 +5.6607412261655554e-05 0.9999433755874634 +2.6039100703201257e-05 0.9999740123748779 +0.8238982558250427 0.17610180377960205 +0.9999961853027344 3.803294475801522e-06 +0.8306329846382141 0.16936703026294708 +0.004989967681467533 0.9950100183486938 +0.9999562501907349 4.37545204476919e-05 +0.8104994893074036 0.18950051069259644 +0.1924203634262085 0.8075796365737915 +0.9986788630485535 0.0013210757169872522 +0.9925569295883179 0.007443094160407782 +0.9999228715896606 7.715148240095004e-05 +0.9976639747619629 0.002336043631657958 +0.9923255443572998 0.007674520369619131 +0.9998101592063904 0.00018985586939379573 +0.9999511241912842 4.883933797827922e-05 +5.096000313642435e-05 0.9999489784240723 +0.9829124212265015 0.017087625339627266 +6.052123353583738e-05 0.9999394416809082 +0.999498724937439 0.000501279893796891 +0.9998984336853027 0.00010158013901673257 +0.01065274141728878 0.9893472194671631 +0.9580251574516296 0.04197491332888603 +5.609523577732034e-05 0.9999438524246216 +0.9839915633201599 0.01600835658609867 +0.9588726162910461 0.04112736135721207 +0.9999382495880127 6.175404269015417e-05 +0.00030937488190829754 0.9996906518936157 +0.9998912811279297 0.00010867450328078121 +0.961337149143219 0.0386628620326519 +0.9600986838340759 0.03990129381418228 +0.05181041359901428 0.9481896162033081 +0.9890230894088745 0.010976864024996758 +0.998705267906189 0.0012946996139362454 +0.0001094204853870906 0.9998905658721924 +0.9997100234031677 0.00028997473418712616 +0.04300781711935997 0.9569922089576721 +0.9338480830192566 0.06615191698074341 +0.9958118200302124 0.00418825400993228 +0.9998983144760132 0.00010166210995521396 +0.999958872795105 4.1132105252472684e-05 +4.890392233392049e-07 0.9999995231628418 +0.9992521405220032 0.0007478176848962903 +0.6054016351699829 0.3945983648300171 +0.9868423342704773 0.013157615438103676 +0.9889911413192749 0.011008881963789463 +0.9998748302459717 0.00012516767310444266 +0.9898144006729126 0.010185537859797478 +0.9999963045120239 3.6559715681505622e-06 +8.248216545325704e-06 0.999991774559021 +7.083381206030026e-05 0.9999291896820068 +0.8517681360244751 0.14823181927204132 +0.9998573064804077 0.00014268388622440398 +0.226741760969162 0.7732582688331604 +0.0021568185184150934 0.9978431463241577 +0.9999974966049194 2.5507665668556e-06 +0.7784472703933716 0.22155267000198364 +0.00014429011207539588 0.999855637550354 +0.9575188159942627 0.04248115047812462 +0.9979748129844666 0.0020251877140253782 +7.86535558905399e-11 1.0 +0.9999089241027832 9.101148316403851e-05 +0.9999138116836548 8.623124449513853e-05 +0.9910886287689209 0.008911311626434326 +0.9989448189735413 0.0010552076855674386 +4.641624684609269e-07 0.9999995231628418 +0.7891150116920471 0.21088503301143646 +0.9999868869781494 1.3058684089628514e-05 +0.9999970197677612 2.941983666460146e-06 +0.8689448833465576 0.1310550570487976 +0.3376055657863617 0.6623944044113159 +0.9999071359634399 9.286151907872409e-05 +0.8381814360618591 0.16181853413581848 +0.9999415874481201 5.843859617016278e-05 +0.00017024714907165617 0.9998297691345215 +0.9549890756607056 0.045010898262262344 +0.9431204795837402 0.05687952786684036 +0.9730234146118164 0.026976628229022026 +0.4345017969608307 0.5654981732368469 +0.008959585800766945 0.9910404086112976 +0.999984622001648 1.534017428639345e-05 +4.797702491364519e-13 1.0 +0.9999799728393555 2.0020206648041494e-05 +0.9994391798973083 0.0005607671337202191 +0.003458332037553191 0.9965416789054871 +0.9998607635498047 0.00013921862409915775 +0.9989172220230103 0.0010828474769368768 +0.6554301381111145 0.3445698320865631 +0.7769662737846375 0.22303368151187897 +0.9932230710983276 0.006776981987059116 +0.0023162488359957933 0.9976837635040283 +0.46665382385253906 0.5333462357521057 +0.9976379871368408 0.002362056402489543 +0.9998397827148438 0.00016021626652218401 +0.9999264478683472 7.349231600528583e-05 +0.9166674613952637 0.08333252370357513 +0.999894380569458 0.00010558007488725707 +0.9996912479400635 0.00030878346296958625 +6.543018571392167e-08 0.9999998807907104 +0.5708987712860107 0.42910119891166687 +0.9327595829963684 0.06724049150943756 +0.9999959468841553 4.0053882912616245e-06 +0.9675412774085999 0.03245868906378746 +0.11647456884384155 0.8835254907608032 +0.15205606818199158 0.847943902015686 +0.924543023109436 0.07545702159404755 +7.285142783075571e-05 0.9999271631240845 +0.9997857213020325 0.0002142655721399933 +0.9999442100524902 5.574339593295008e-05 +3.4832971778087085e-06 0.999996542930603 +0.9999926090240479 7.385258868453093e-06 +0.9275205135345459 0.07247941941022873 +0.9290695786476135 0.07093050330877304 +0.999881386756897 0.00011856786295538768 +0.9999496936798096 5.024946585763246e-05 +0.9999481439590454 5.185203917790204e-05 +0.9999880790710449 1.1961413292738143e-05 +0.0003657848574221134 0.9996341466903687 +9.216146850121731e-07 0.9999990463256836 +0.9996147155761719 0.00038531466270796955 +0.03485872969031334 0.965141236782074 +0.00018975343846250325 0.9998102784156799 +0.9999996423721313 3.3433522617087874e-07 +0.9893149137496948 0.010685115121304989 +0.014397694729268551 0.9856023192405701 +0.6347071528434753 0.36529284715652466 +0.9973329305648804 0.002667102962732315 +0.999889612197876 0.00011041222751373425 +0.9851716160774231 0.014828396029770374 +0.02498050220310688 0.9750195741653442 +0.8889596462249756 0.11104034632444382 +0.9999948740005493 5.113650786370272e-06 +0.17990393936634064 0.8200960755348206 +0.9314794540405273 0.06852050870656967 +0.9999984502792358 1.5780791500219493e-06 +0.7367360591888428 0.26326388120651245 +4.930030627292581e-06 0.9999951124191284 +0.9433773159980774 0.05662274733185768 +0.739848792552948 0.2601512372493744 +0.006819512695074081 0.993180513381958 +0.8011875152587891 0.19881251454353333 +0.9301743507385254 0.0698256567120552 +0.9873091578483582 0.012690817005932331 +0.006474942900240421 0.9935250282287598 +0.0854438841342926 0.9145561456680298 +0.9875878691673279 0.012412124313414097 +0.9999783039093018 2.1693302187486552e-05 +0.9971367120742798 0.0028633116744458675 +0.8282755017280579 0.17172443866729736 +0.8381868004798889 0.1618131399154663 +0.9996523857116699 0.0003476418205536902 +0.9999303817749023 6.960502651054412e-05 +6.0231057432247326e-05 0.9999397993087769 +0.9745855927467346 0.02541440911591053 +0.8063266277313232 0.19367335736751556 +0.9988768696784973 0.0011231729295104742 +0.8995218276977539 0.10047809779644012 +0.9800066351890564 0.019993405789136887 +0.9988716244697571 0.0011284009087830782 +0.9986936450004578 0.0013063679216429591 +0.9999983310699463 1.6610330249022809e-06 +0.9999798536300659 2.0186693291179836e-05 +0.08027368038892746 0.9197263717651367 +0.9517129063606262 0.048287104815244675 +0.015422538854181767 0.984577476978302 +0.997600257396698 0.002399696735665202 +0.007619958836585283 0.9923800230026245 +0.9923267960548401 0.007673161569982767 +0.9993860721588135 0.0006139011820778251 +0.9609296321868896 0.039070434868335724 +0.9367172122001648 0.06328282505273819 +0.5607011914253235 0.4392988383769989 +5.318564717526897e-07 0.9999995231628418 +0.9966511130332947 0.0033489190973341465 +0.9173072576522827 0.0826927125453949 +2.406881449701359e-08 1.0 +0.9999890327453613 1.1017826182069257e-05 +0.9950845837593079 0.004915405996143818 +0.9972246885299683 0.002775282831862569 +0.999876856803894 0.00012309230805840343 +0.511687695980072 0.48831233382225037 +0.00017383099475409836 0.9998262524604797 +0.9997095465660095 0.0002903938584495336 +0.04250754043459892 0.957492470741272 +0.0825970247387886 0.917402982711792 +0.883415699005127 0.11658426374197006 +0.9992890357971191 0.0007109928992576897 +3.6706478567793965e-06 0.9999963045120239 +0.00041957912617363036 0.999580442905426 +0.0034337968099862337 0.9965662360191345 +0.0025795837864279747 0.9974204301834106 +0.9940451383590698 0.0059548188000917435 +0.0002426278661005199 0.9997573494911194 +0.953295111656189 0.046704936772584915 +0.7597107887268066 0.24028916656970978 +5.75362435029092e-07 0.9999994039535522 +0.999833345413208 0.00016662846610415727 +1.0535859962246263e-09 1.0 +0.15889044106006622 0.841109573841095 +0.8487240076065063 0.15127600729465485 +0.9998119473457336 0.00018804952560458332 +0.7748852372169495 0.22511470317840576 +0.9990695118904114 0.0009304761188104749 +0.995189905166626 0.004810101818293333 +0.9996241331100464 0.0003758403763640672 +0.9999953508377075 4.590831395034911e-06 +0.9997206330299377 0.0002793869352899492 +0.030857346951961517 0.9691426753997803 +0.9999920129776001 7.935722351248842e-06 +0.9986991882324219 0.0013007957022637129 +0.9632222056388855 0.03677775710821152 +0.9999549388885498 4.506126788328402e-05 +0.9833811521530151 0.016618827357888222 +0.9945966005325317 0.005403310991823673 +0.9999295473098755 7.049996929708868e-05 +0.8726794719696045 0.1273205429315567 +0.5480396151542664 0.45196038484573364 +0.9999912977218628 8.708932909939904e-06 +3.044563356979779e-07 0.9999996423721313 +0.4884990453720093 0.511500895023346 +0.9999558925628662 4.410284964251332e-05 +0.0013927229447290301 0.998607337474823 +0.009765226393938065 0.9902348518371582 +0.9685745239257812 0.03142549470067024 +0.9254651665687561 0.0745348185300827 +0.3337121903896332 0.6662877798080444 +0.9999887943267822 1.119600437959889e-05 +0.9906603693962097 0.009339618496596813 +0.9685745239257812 0.03142549470067024 +0.006740563083440065 0.9932593703269958 +0.9999961853027344 3.85885050491197e-06 +3.629901357271592e-07 0.9999996423721313 +0.934252142906189 0.06574781984090805 +0.007116943132132292 0.9928830862045288 +7.037731393211288e-07 0.9999992847442627 +0.999893069267273 0.00010697087418520823 +0.9997791647911072 0.00022086691751610488 +0.09022868424654007 0.9097712635993958 +0.09035655111074448 0.9096434116363525 +0.6130415797233582 0.3869584798812866 +0.03604685515165329 0.9639530777931213 +0.9997678399085999 0.00023215077817440033 +0.8518919944763184 0.14810799062252045 +0.9921340942382812 0.007865877822041512 +0.9982209801673889 0.0017789960838854313 +0.4990655183792114 0.5009344816207886 +0.9998867511749268 0.00011325316881993786 +0.9972509741783142 0.002748970640823245 +0.9990136623382568 0.0009862740989774466 +0.04258143529295921 0.9574185013771057 +0.9979773163795471 0.002022656612098217 +0.00170273391995579 0.9982972741127014 +0.9992154836654663 0.0007844708161428571 +0.9999994039535522 5.988696329950471e-07 +0.29590702056884766 0.7040929794311523 +0.9998394250869751 0.0001605670986464247 +0.9999637603759766 3.619980998337269e-05 +0.9999910593032837 8.895711289369501e-06 +0.9202988743782043 0.07970114797353745 +0.0006385140586644411 0.9993614554405212 +0.999945878982544 5.410108860814944e-05 +0.9620537161827087 0.03794630244374275 +2.8449434466892853e-05 0.9999715089797974 +0.008708189241588116 0.9912918210029602 +0.999786913394928 0.0002130416687577963 +0.9994038343429565 0.0005961833521723747 +0.08757160604000092 0.9124283194541931 +0.2788959741592407 0.721104085445404 +0.9998784065246582 0.0001216340679093264 +0.000586844515055418 0.9994131326675415 +0.9932354092597961 0.006764642894268036 +0.5138823390007019 0.4861176908016205 +0.9999340772628784 6.58786520943977e-05 +0.9999055862426758 9.441948350286111e-05 +0.058314643800258636 0.9416853189468384 +3.1827673296902503e-07 0.9999996423721313 +0.9062193632125854 0.09378059953451157 +0.3755261301994324 0.6244738698005676 +0.9990484118461609 0.0009515314595773816 +4.8617998515965155e-09 1.0 +0.9998499155044556 0.0001500763464719057 +0.9525101184844971 0.047489847987890244 +8.557045475754421e-06 0.9999914169311523 +0.6955783367156982 0.30442163348197937 +0.0013446572702378035 0.9986553192138672 +0.9748040437698364 0.025195982307195663 +0.41111892461776733 0.5888810753822327 +0.9934592247009277 0.006540720816701651 +0.9999262094497681 7.374441338470206e-05 +0.00020276627037674189 0.9997972846031189 +0.9937252402305603 0.006274723447859287 +0.00010733706585597247 0.9998925924301147 +0.9928871989250183 0.007112863473594189 +0.0602891631424427 0.9397108554840088 +0.9996383190155029 0.00036165796336717904 +0.0011588835623115301 0.9988411068916321 +0.9999188184738159 8.113295916700736e-05 +0.9908154010772705 0.009184620343148708 +0.522026002407074 0.47797396779060364 +0.9999701976776123 2.9817896574968472e-05 +0.9991376399993896 0.0008623311878181994 +0.9985169768333435 0.0014830041909590364 +0.9996399879455566 0.0003599420888349414 +0.9999990463256836 9.134150218415016e-07 +0.640516459941864 0.359483540058136 +0.9618650674819946 0.038134992122650146 +0.9396104216575623 0.06038954481482506 +0.999846339225769 0.00015368135063908994 +0.9973353743553162 0.0026645760517567396 +0.07111228257417679 0.9288877844810486 +0.9820839762687683 0.017916034907102585 +0.9932542443275452 0.006745814345777035 +0.903160572052002 0.09683939814567566 +7.4447594755611135e-09 1.0 +0.0007499365019612014 0.9992499947547913 +0.9993971586227417 0.0006028888747096062 +0.5567896366119385 0.4432104229927063 +5.036302354710642e-06 0.9999949932098389 +0.9275308847427368 0.07246915251016617 +1.5821095075807534e-05 0.9999841451644897 +0.9999226331710815 7.732493395451456e-05 +0.0025079061742872 0.9974920749664307 +0.9999935626983643 6.464079433499137e-06 +2.063066162349969e-08 1.0 +0.999344527721405 0.0006554379360750318 +0.999762237071991 0.00023780007904861122 +0.5607470273971558 0.43925294280052185 +0.004888234660029411 0.9951117634773254 +0.9999599456787109 4.00401622755453e-05 +0.9981156587600708 0.0018843263387680054 +0.9999803304672241 1.9677449017763138e-05 +0.008506403304636478 0.9914935827255249 +0.9981905817985535 0.0018094099359586835 +0.9999939203262329 6.022808065608842e-06 +0.9997492432594299 0.0002507257158868015 +0.8678835034370422 0.13211651146411896 +0.04346703737974167 0.9565330147743225 +0.00040210483712144196 0.99959796667099 +0.9017825126647949 0.09821751713752747 +0.9939233660697937 0.0060766092501580715 +5.989947453599598e-07 0.9999994039535522 +0.9997304081916809 0.0002695649745874107 +3.269677506523294e-07 0.9999996423721313 +0.9969833493232727 0.0030166786164045334 +0.9517912268638611 0.04820884019136429 +0.9999783039093018 2.1741187083534896e-05 +9.318217780673876e-05 0.9999067783355713 +0.9998562335968018 0.00014380061475094408 +0.3769559860229492 0.623043954372406 +0.9998469352722168 0.0001530707668280229 +0.9999862909317017 1.3655897419084795e-05 +0.9993302822113037 0.0006697573116980493 +0.15087568759918213 0.8491243124008179 +0.3585548996925354 0.6414450407028198 +0.9995833039283752 0.0004167572478763759 +0.9699705839157104 0.030029406771063805 +0.9976567029953003 0.0023432616144418716 +0.9995654225349426 0.0004345984198153019 +0.9999468326568604 5.319152114680037e-05 +0.01776832714676857 0.9822316765785217 +0.9999912977218628 8.687638910487294e-06 +0.9995306730270386 0.0004693038354162127 +0.9969593286514282 0.0030407337471842766 +0.7958576083183289 0.20414242148399353 +0.7064720988273621 0.2935279309749603 +0.9999697208404541 3.022661985596642e-05 +3.67343527614139e-05 0.9999632835388184 +0.9659992456436157 0.0340007022023201 +1.5184506310106372e-06 0.9999984502792358 +0.999897837638855 0.00010216181544819847 +0.08395311236381531 0.9160469174385071 +0.15092000365257263 0.849079966545105 +0.9279717206954956 0.07202835381031036 +0.9999750852584839 2.48734049819177e-05 +0.9203755259513855 0.07962450385093689 +4.529081252258038e-06 0.9999954700469971 +0.9543004035949707 0.0456995815038681 +0.8035893440246582 0.1964106261730194 +0.9665433168411255 0.033456698060035706 +0.9999411106109619 5.8903253375319764e-05 +2.718790312883357e-07 0.9999997615814209 +0.22823651134967804 0.7717635035514832 +0.9616555571556091 0.03834441676735878 +0.9989759922027588 0.0010240200208500028 +0.9999855756759644 1.4466210814134683e-05 +0.9992571473121643 0.0007428252720274031 +4.4184514990774915e-05 0.9999557733535767 +0.9813732504844666 0.018626734614372253 +0.9996235370635986 0.00037640007212758064 +0.45522207021713257 0.5447779297828674 +0.9984334111213684 0.0015666189137846231 +0.5999354124069214 0.4000645875930786 +0.9992015957832336 0.0007983882678672671 +1.1163784847667557e-06 0.999998927116394 +0.9999932050704956 6.819630016252631e-06 +0.9733205437660217 0.026679448783397675 +0.9996452331542969 0.0003547593660186976 +0.9831674695014954 0.01683255285024643 +0.6404561996459961 0.3595438301563263 +0.9756172895431519 0.024382784962654114 +5.3901224816854665e-08 1.0 +0.9999752044677734 2.4776625650702044e-05 +6.151201523607597e-05 0.9999384880065918 +0.06782747805118561 0.9321725964546204 +0.8198803067207336 0.18011964857578278 +0.7196502685546875 0.2803496718406677 +0.9816163778305054 0.018383584916591644 +0.10275167971849442 0.8972483277320862 +0.0002488196187186986 0.9997511506080627 +8.342409273609519e-05 0.9999165534973145 +0.9998685121536255 0.00013146884157322347 +0.9984714388847351 0.0015285988338291645 +0.9258694648742676 0.07413050532341003 +1.120878323490615e-08 1.0 +0.9015117287635803 0.09848826378583908 +0.0031838531140238047 0.9968162178993225 +0.9999969005584717 3.1560648494632915e-06 +0.9999675750732422 3.247032145736739e-05 +0.999393105506897 0.000606913585215807 +0.9986691474914551 0.0013309227069839835 +0.8089115619659424 0.19108842313289642 +0.9996803998947144 0.0003196683246642351 +0.3002210855484009 0.6997789144515991 +0.9999908208847046 9.12171890377067e-06 +0.9135971665382385 0.08640281111001968 +0.9970927238464355 0.0029073168989270926 +0.06237632781267166 0.9376236796379089 +0.9997960925102234 0.0002039155806414783 +0.9999871253967285 1.286438691749936e-05 +0.8027787804603577 0.19722121953964233 +1.0446061793345507e-08 1.0 +0.9908953905105591 0.009104611352086067 +0.3253200054168701 0.6746799945831299 +0.999521017074585 0.0004789357481058687 +7.699640036662458e-08 0.9999998807907104 +0.9891263246536255 0.010873646475374699 +0.9063988327980042 0.09360110759735107 +0.7809692025184631 0.21903081238269806 +0.999873161315918 0.0001268410123884678 +0.008283156901597977 0.9917168021202087 +0.9999409914016724 5.894730566069484e-05 +0.9855729937553406 0.014427030459046364 +0.9714321494102478 0.02856782265007496 +0.9999531507492065 4.679941412177868e-05 +0.9885430335998535 0.01145696360617876 +0.989084780216217 0.01091520581394434 +0.6579383015632629 0.34206169843673706 +0.993756890296936 0.006243090145289898 +3.4057687781086088e-09 1.0 +0.9917623996734619 0.008237648755311966 +0.9420074224472046 0.05799262225627899 +0.9658148288726807 0.03418519347906113 +0.962051510810852 0.03794848546385765 +0.9975982308387756 0.0024017158430069685 +0.725468099117279 0.27453184127807617 +0.9995902180671692 0.0004097826895304024 +0.027873143553733826 0.972126841545105 +0.9987267851829529 0.0012732003815472126 +0.9999923706054688 7.612093213538174e-06 +0.9996806383132935 0.00031932350248098373 +0.9975622892379761 0.0024377263616770506 +0.9914565682411194 0.008543377742171288 +0.850246012210846 0.14975394308567047 +0.00613927049562335 0.9938607215881348 +0.04651568830013275 0.953484296798706 +0.8069931268692017 0.19300685822963715 +0.011340790428221226 0.9886592030525208 +0.5788864493370056 0.4211135506629944 +0.06980060786008835 0.930199384689331 +0.9999834299087524 1.6547259292565286e-05 +0.9645374417304993 0.03546259179711342 +0.9999163150787354 8.368112321477383e-05 diff --git a/src/medicine/train_cancer/train_model/data_gen/__pycache__/data_output.cpython-311.pyc b/src/medicine/train_cancer/train_model/data_gen/__pycache__/data_output.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b2db3a46b4de508eaf108985811e5587fdc01ec9 GIT binary patch literal 837 zcmZuvJ8K(35T3no7FaPkL7QioKl;RZ1 z@&zgvz=4wxBGM-WEI0ygodLHmG3yFfE`5tTZ=vljjM*mXW;bFZamX|~60uNBOXU}# ztBn-KavPNk5YQ(a@Dg$ceVbc&m7P{cBBmU#@XKhERKaEATE0fW=Ex_YsO3@vZG44r zi`(4c&NufGN4hG<0?b%9&H-yxdW#n3EX?VmkMOSTq~1)*h$A)6nR3N{^>3%spxoW50sh!cA=$a7!>uB+n5}*I#CBxn2f$AY}Tbk^&&$Ib_Bns`H6(g<2qClIv>NhFj|6{7Y4vLf|nSz1kYC(f4raA(&6 zM=s>hLsV62kb=T7rvOS1T=^Gkv{J1-S)d%EUL4X3J@IDOc5DS95WJmz^FC(Yym|B9 z`+i^`jR0QG{Gt7vKW;g2AXwd8%2#mAh@3PJileORWJs}lpbgh48lIY9L-Q_G<_ z>dxG}1+0`K8Zp(Dk#G`P%;^;%_7FvRK|}eNCOk%YF$FHd9M?oREFN53Wt2Fs;xeLJ zic1|=ZExpRB=|-6PqzT=A-79+0Fp!aBd8*!qjUML7HEPN)5PcT1F&+)Ersw%(4)!i5B1g$}Sz7D~)k>@@|ZA|qyDrQ)vJRv`+bN-UMK78BYpgjlzV9b&pv z39zE*mhLLb=GeJsm~QKmaH#Vspe=MXa`l_SZectAG<`JqW@C7~KKfQ;^m?-|@kaUt z0eZ#Jw%ELYGUMCn2JU~Bev;mq{cfy=ule|z*B+-}4yoP2ha`_4`geH7Jyb;x_>vIz zI}h8I@VP1+fc&td6aK-T?!CJq#)_oYpzMYZZO)S&%fT z%XHPrrq~63l1Ma-@plU{_Y8ZL73D#)P#yO_ zO+OoaGPtu*!{a_4_wYE>RV4d%!*3ihiX+?qFR5m!> zuP6`8#E3L318c)L{fNSSQQ$C_a>V28ECAZ-e9hRPbiIi>=xtHLO*|xl8|P7ElUvGV zQ$hdd@aE2R*e0D;XAVWJ%!t$uQ>RI(Waw)6_Dac#RjM z3xC9Jfr2+M=W9SsQ4oYWddKS>bu{Yrjyjt5dPg0->-COi{DuIxK95eg?A2c=LI?i@ Dp^N4> literal 0 HcmV?d00001 diff --git a/src/medicine/train_cancer/train_model/modeling/__pycache__/reduce_study_rate.cpython-311.pyc b/src/medicine/train_cancer/train_model/modeling/__pycache__/reduce_study_rate.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b595f697cbeaf01953029cfa95ead10d3d64709c GIT binary patch literal 1135 zcmb7Cy-yTD6rb7M`|#idJV4zgDVrPtCp@|j>1Zg}knG8E~A7OU)oZUl@U_wDb zVNc`_z!*vV2W&0uC`jB)Wnze-J3JB-D&OoLhXfnn?)>J>yx)8CX5M?B&1MkD&o95( zzJbsWy*L%Ct90&wvV|C8SRe7)(%AY2qTt~#S+g@A$h2m z1+0b^IBVMc$-fE)tO096YXMO2UsR?;U&E2*yeQ6hM zD#Q}Cm;JabQvr89ERjC!jaxP{)Ztt{0|;HG3fvR literal 0 HcmV?d00001 diff --git a/src/medicine/train_cancer/train_model/modeling/modeling.py b/src/medicine/train_cancer/train_model/modeling/modeling.py new file mode 100644 index 00000000..49dfc118 --- /dev/null +++ b/src/medicine/train_cancer/train_model/modeling/modeling.py @@ -0,0 +1,45 @@ +from keras.models import Sequential +from keras import layers +from keras.src.applications import DenseNet201 +from keras.src.optimizers import Nadam + +class breast_train_test: + def __init__(self): + # 构造模型序列 + self.model = Sequential() + # DenseNet201 201层的卷积神经网络 + net = DenseNet201( + # 使用处理图片神经网络 + weights='imagenet', + include_top=False, + # 224 * 224 的图片通道数为3 RGB + input_shape=(224, 224, 3) + ) + # 学习率 0.0001 + study_rate = 10**(-4) + + self.build(net , study_rate) + + + ''' + resnet:DenseNet201网络 + study_rate 学习率 + ''' + def build(self , resnet , study_rate): + self.model.add(resnet) + # GlobalAveragePooling2D每个通道值各自加起来再求平均,只剩下个数与平均值两个维度 + self.model.add(layers.GlobalAveragePooling2D()) + # dropout 减少中间神经元个数 保留概率为0.5 + self.model.add(layers.Dropout(0.5)) + # BatchNormalization 每一个批次的数据中标准化前一层的激活项 + self.model.add(layers.BatchNormalization()) + # dense 全连接层 输出维度为2 activation激活函数为softmax在思路整理中给出 + self.model.add(layers.Dense(2, activation='softmax')) + self.model.compile( + # 二元交叉熵在思路整理给出 + loss = "binary_crossentropy", + # nadam作为优化器在思路整理中给出 + optimizer=Nadam(learning_rate=study_rate), + # 评估函数 + metrics=['accuracy'] + ) \ No newline at end of file diff --git a/src/medicine/train_cancer/train_model/modeling/reduce_study_rate.py b/src/medicine/train_cancer/train_model/modeling/reduce_study_rate.py new file mode 100644 index 00000000..ee284c22 --- /dev/null +++ b/src/medicine/train_cancer/train_model/modeling/reduce_study_rate.py @@ -0,0 +1,24 @@ +# 降低学习率 +from keras.src.callbacks import ReduceLROnPlateau +from tensorflow.python.keras.callbacks import ModelCheckpoint + +class reduce: + def train(self): + # 控制学习率 + self.learn_control = ReduceLROnPlateau( + monitor='val_accuracy', + patience=5, + verbose=1, + factor=0.2, + min_lr=1e-7 + ) + + path = "D:\\pro_of_program\\Python\\train_cancer\\train_model\\third_model" + # 保存模型只保存最优解 + self.checkpoint = ModelCheckpoint( + filepath=path, + monitor='val_accuracy', + verbose=1, + save_best_only=True, + mode='max' + ) \ No newline at end of file diff --git a/src/medicine/train_cancer/train_model/test/predict.py b/src/medicine/train_cancer/train_model/test/predict.py new file mode 100644 index 00000000..383b279c --- /dev/null +++ b/src/medicine/train_cancer/train_model/test/predict.py @@ -0,0 +1,24 @@ +import numpy as np +import cv2 +from PIL import Image +import tensorflow as tf +import sys + +def load_single(dir , size): + read = lambda i: np.asarray(Image.open(i).convert("RGB")) + path = dir + img = read(path) + return np.array(cv2.resize(img, (size, size))) + +def check(dir_pic , dir_model): + pic_test = dir_pic + # 转换为numpy格式 + img_test = load_single(pic_test , 224) + # 需要(1,224,224,3)这种格式输入 + img_test = np.expand_dims(img_test , axis=0) + + # 载入模型 + x = tf.keras.models.load_model(dir_model) + res = x.predict(img_test) + np.set_printoptions(suppress=True) + return f'{res[0][0] * 100 : .4f}%,{res[0][1] * 100 : .4f}%' \ No newline at end of file diff --git a/src/medicine/train_cancer/train_model/train/train.py b/src/medicine/train_cancer/train_model/train/train.py new file mode 100644 index 00000000..eba742ce --- /dev/null +++ b/src/medicine/train_cancer/train_model/train/train.py @@ -0,0 +1,30 @@ +from loader_picture import data_loader +import numpy as np +from matplotlib import pyplot as plt + +from train_model.modeling import reduce_study_rate +from train_model.modeling import modeling +from train_model.data_gen import data_output + +# 载入图片 +load = data_loader.Loader() +# 获取模型 +models = modeling.breast_train_test() +# 展现模型 +models.model.summary() +# data +data = data_output.gen_data() + +# 降低学习率 +reduces = reduce_study_rate.reduce() +reduces.train() + +# 训练+评估 +history = models.model.fit( + data.tr_gen.flow(load.train_of_x , load.train_of_y , batch_size=data.batch), + steps_per_epoch = load.train_of_x.shape[0] / data.batch, + # 训练30次 + epochs=50, + validation_data=(load.val_of_x , load.val_of_y), + callbacks=[reduces.learn_control , reduces.checkpoint] +) \ No newline at end of file diff --git a/src/medicine/train_cancer/train_test.ipynb b/src/medicine/train_cancer/train_test.ipynb new file mode 100644 index 00000000..c93f2dbe --- /dev/null +++ b/src/medicine/train_cancer/train_test.ipynb @@ -0,0 +1,981 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 95, + "outputs": [], + "source": [ + "path = 'D:\\\\pro_of_program\\\\Python\\\\train_cancer\\\\train_model\\\\models\\\\fingerprint.pb'\n", + "path1 = 'D:\\\\pro_of_program\\\\Python\\\\train_cancer\\\\train_model\\\\models\\\\saved_model.pb'\n", + "path2 = 'D:\\\\pro_of_program\\\\Python\\\\train_cancer\\\\train_model\\\\models'" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": 9, + "outputs": [], + "source": [ + "from PIL import Image" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": 10, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + } + ], + "source": [ + "f = open('picture\\\\benign\\\\benign (1).png' , 'rb')\n", + "img = Image.open(f)\n", + "print(img)" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [ + "from loader_picture import data_loader\n", + "import numpy as np\n", + "from matplotlib import pyplot as plt\n", + "\n", + "load = data_loader.Loader()\n", + "w = 60\n", + "h = 40\n", + "fig = plt.figure(figsize=(15, 15))\n", + "columns = 4\n", + "rows = 3\n", + "\n", + "for i in range(1, columns*rows +1):\n", + " ax = fig.add_subplot(rows, columns, i)\n", + " if np.argmax(load.y_train[i]) == 0:\n", + " ax.title.set_text('Benign')\n", + " else:\n", + " ax.title.set_text('Malignant')\n", + " plt.imshow(load.train_of_x[i], interpolation='nearest')\n", + "plt.show()" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "markdown", + "source": [ + " ### *展现图片*" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": 1, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Model: \"sequential\"\n", + "_________________________________________________________________\n", + " Layer (type) Output Shape Param # \n", + "=================================================================\n", + " densenet201 (Functional) (None, 7, 7, 1920) 18321984 \n", + " \n", + " global_average_pooling2d ( (None, 1920) 0 \n", + " GlobalAveragePooling2D) \n", + " \n", + " dropout (Dropout) (None, 1920) 0 \n", + " \n", + " batch_normalization (Batch (None, 1920) 7680 \n", + " Normalization) \n", + " \n", + " dense (Dense) (None, 2) 3842 \n", + " \n", + "=================================================================\n", + "Total params: 18333506 (69.94 MB)\n", + "Trainable params: 18100610 (69.05 MB)\n", + "Non-trainable params: 232896 (909.75 KB)\n", + "_________________________________________________________________\n", + "Epoch 1/20\n", + "23/22 [==============================] - ETA: -2s - loss: 0.7998 - accuracy: 0.4757\n", + "Epoch 00001: val_accuracy improved from -inf to 0.65641, saving model to D:\\pro_of_program\\Python\\train_cancer\\train_model\\models\n", + "INFO:tensorflow:Assets written to: D:\\pro_of_program\\Python\\train_cancer\\train_model\\models\\assets\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:tensorflow:Assets written to: D:\\pro_of_program\\Python\\train_cancer\\train_model\\models\\assets\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "22/22 [==============================] - 255s 10s/step - loss: 0.7998 - accuracy: 0.4757 - val_loss: 0.6391 - val_accuracy: 0.6564 - lr: 1.0000e-04\n", + "Epoch 2/20\n", + "23/22 [==============================] - ETA: -3s - loss: 0.6808 - accuracy: 0.6261\n", + "Epoch 00002: val_accuracy improved from 0.65641 to 0.66154, saving model to D:\\pro_of_program\\Python\\train_cancer\\train_model\\models\n", + "INFO:tensorflow:Assets written to: D:\\pro_of_program\\Python\\train_cancer\\train_model\\models\\assets\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:tensorflow:Assets written to: D:\\pro_of_program\\Python\\train_cancer\\train_model\\models\\assets\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "22/22 [==============================] - 254s 11s/step - loss: 0.6808 - accuracy: 0.6261 - val_loss: 0.6762 - val_accuracy: 0.6615 - lr: 1.0000e-04\n", + "Epoch 3/20\n", + "23/22 [==============================] - ETA: -4s - loss: 0.6415 - accuracy: 0.6704\n", + "Epoch 00003: val_accuracy improved from 0.66154 to 0.75385, saving model to D:\\pro_of_program\\Python\\train_cancer\\train_model\\models\n", + "INFO:tensorflow:Assets written to: D:\\pro_of_program\\Python\\train_cancer\\train_model\\models\\assets\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:tensorflow:Assets written to: D:\\pro_of_program\\Python\\train_cancer\\train_model\\models\\assets\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "22/22 [==============================] - 311s 14s/step - loss: 0.6415 - accuracy: 0.6704 - val_loss: 0.4893 - val_accuracy: 0.7538 - lr: 1.0000e-04\n", + "Epoch 4/20\n", + "23/22 [==============================] - ETA: -4s - loss: 0.6047 - accuracy: 0.6925\n", + "Epoch 00004: val_accuracy did not improve from 0.75385\n", + "22/22 [==============================] - 320s 14s/step - loss: 0.6047 - accuracy: 0.6925 - val_loss: 0.6372 - val_accuracy: 0.7026 - lr: 1.0000e-04\n", + "Epoch 5/20\n", + "23/22 [==============================] - ETA: -5s - loss: 0.5482 - accuracy: 0.7389\n", + "Epoch 00005: val_accuracy improved from 0.75385 to 0.82564, saving model to D:\\pro_of_program\\Python\\train_cancer\\train_model\\models\n", + "INFO:tensorflow:Assets written to: D:\\pro_of_program\\Python\\train_cancer\\train_model\\models\\assets\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:tensorflow:Assets written to: D:\\pro_of_program\\Python\\train_cancer\\train_model\\models\\assets\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "22/22 [==============================] - 377s 17s/step - loss: 0.5482 - accuracy: 0.7389 - val_loss: 0.4255 - val_accuracy: 0.8256 - lr: 1.0000e-04\n", + "Epoch 6/20\n", + "23/22 [==============================] - ETA: -4s - loss: 0.5924 - accuracy: 0.7235\n", + "Epoch 00006: val_accuracy did not improve from 0.82564\n", + "22/22 [==============================] - 319s 14s/step - loss: 0.5924 - accuracy: 0.7235 - val_loss: 0.4945 - val_accuracy: 0.8103 - lr: 1.0000e-04\n", + "Epoch 7/20\n", + "23/22 [==============================] - ETA: -4s - loss: 0.5449 - accuracy: 0.7544\n", + "Epoch 00007: val_accuracy did not improve from 0.82564\n", + "22/22 [==============================] - 309s 14s/step - loss: 0.5449 - accuracy: 0.7544 - val_loss: 0.4458 - val_accuracy: 0.8051 - lr: 1.0000e-04\n", + "Epoch 8/20\n", + "23/22 [==============================] - ETA: -4s - loss: 0.5249 - accuracy: 0.7522\n", + "Epoch 00008: val_accuracy did not improve from 0.82564\n", + "22/22 [==============================] - 305s 14s/step - loss: 0.5249 - accuracy: 0.7522 - val_loss: 0.5102 - val_accuracy: 0.8154 - lr: 1.0000e-04\n", + "Epoch 9/20\n", + "23/22 [==============================] - ETA: -4s - loss: 0.4692 - accuracy: 0.7920\n", + "Epoch 00009: val_accuracy did not improve from 0.82564\n", + "22/22 [==============================] - 309s 14s/step - loss: 0.4692 - accuracy: 0.7920 - val_loss: 0.5340 - val_accuracy: 0.7744 - lr: 1.0000e-04\n", + "Epoch 10/20\n", + "23/22 [==============================] - ETA: -4s - loss: 0.4845 - accuracy: 0.7743\n", + "Epoch 10: ReduceLROnPlateau reducing learning rate to 1.9999999494757503e-05.\n", + "\n", + "Epoch 00010: val_accuracy did not improve from 0.82564\n", + "22/22 [==============================] - 314s 14s/step - loss: 0.4845 - accuracy: 0.7743 - val_loss: 0.5581 - val_accuracy: 0.8051 - lr: 1.0000e-04\n", + "Epoch 11/20\n", + "23/22 [==============================] - ETA: -4s - loss: 0.4945 - accuracy: 0.7677\n", + "Epoch 00011: val_accuracy did not improve from 0.82564\n", + "22/22 [==============================] - 305s 14s/step - loss: 0.4945 - accuracy: 0.7677 - val_loss: 0.4358 - val_accuracy: 0.8256 - lr: 2.0000e-05\n", + "Epoch 12/20\n", + "23/22 [==============================] - ETA: -4s - loss: 0.4439 - accuracy: 0.8230\n", + "Epoch 00012: val_accuracy did not improve from 0.82564\n", + "22/22 [==============================] - 301s 14s/step - loss: 0.4439 - accuracy: 0.8230 - val_loss: 0.4098 - val_accuracy: 0.8205 - lr: 2.0000e-05\n", + "Epoch 13/20\n", + "23/22 [==============================] - ETA: -4s - loss: 0.4728 - accuracy: 0.7965\n", + "Epoch 00013: val_accuracy improved from 0.82564 to 0.83077, saving model to D:\\pro_of_program\\Python\\train_cancer\\train_model\\models\n", + "INFO:tensorflow:Assets written to: D:\\pro_of_program\\Python\\train_cancer\\train_model\\models\\assets\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:tensorflow:Assets written to: D:\\pro_of_program\\Python\\train_cancer\\train_model\\models\\assets\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "22/22 [==============================] - 350s 16s/step - loss: 0.4728 - accuracy: 0.7965 - val_loss: 0.3905 - val_accuracy: 0.8308 - lr: 2.0000e-05\n", + "Epoch 14/20\n", + "23/22 [==============================] - ETA: -4s - loss: 0.4464 - accuracy: 0.8009\n", + "Epoch 00014: val_accuracy improved from 0.83077 to 0.84615, saving model to D:\\pro_of_program\\Python\\train_cancer\\train_model\\models\n", + "INFO:tensorflow:Assets written to: D:\\pro_of_program\\Python\\train_cancer\\train_model\\models\\assets\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:tensorflow:Assets written to: D:\\pro_of_program\\Python\\train_cancer\\train_model\\models\\assets\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "22/22 [==============================] - 352s 16s/step - loss: 0.4464 - accuracy: 0.8009 - val_loss: 0.3514 - val_accuracy: 0.8462 - lr: 2.0000e-05\n", + "Epoch 15/20\n", + "23/22 [==============================] - ETA: -4s - loss: 0.4297 - accuracy: 0.8053\n", + "Epoch 00015: val_accuracy did not improve from 0.84615\n", + "22/22 [==============================] - 290s 13s/step - loss: 0.4297 - accuracy: 0.8053 - val_loss: 0.3939 - val_accuracy: 0.8359 - lr: 2.0000e-05\n", + "Epoch 16/20\n", + "23/22 [==============================] - ETA: -4s - loss: 0.4629 - accuracy: 0.7832\n", + "Epoch 00016: val_accuracy improved from 0.84615 to 0.85128, saving model to D:\\pro_of_program\\Python\\train_cancer\\train_model\\models\n", + "INFO:tensorflow:Assets written to: D:\\pro_of_program\\Python\\train_cancer\\train_model\\models\\assets\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:tensorflow:Assets written to: D:\\pro_of_program\\Python\\train_cancer\\train_model\\models\\assets\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "22/22 [==============================] - 337s 15s/step - loss: 0.4629 - accuracy: 0.7832 - val_loss: 0.3266 - val_accuracy: 0.8513 - lr: 2.0000e-05\n", + "Epoch 17/20\n", + "23/22 [==============================] - ETA: -4s - loss: 0.3896 - accuracy: 0.8252\n", + "Epoch 00017: val_accuracy improved from 0.85128 to 0.86667, saving model to D:\\pro_of_program\\Python\\train_cancer\\train_model\\models\n", + "INFO:tensorflow:Assets written to: D:\\pro_of_program\\Python\\train_cancer\\train_model\\models\\assets\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:tensorflow:Assets written to: D:\\pro_of_program\\Python\\train_cancer\\train_model\\models\\assets\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "22/22 [==============================] - 357s 16s/step - loss: 0.3896 - accuracy: 0.8252 - val_loss: 0.3354 - val_accuracy: 0.8667 - lr: 2.0000e-05\n", + "Epoch 18/20\n", + "23/22 [==============================] - ETA: -4s - loss: 0.4505 - accuracy: 0.8208\n", + "Epoch 00018: val_accuracy did not improve from 0.86667\n", + "22/22 [==============================] - 321s 14s/step - loss: 0.4505 - accuracy: 0.8208 - val_loss: 0.3403 - val_accuracy: 0.8667 - lr: 2.0000e-05\n", + "Epoch 19/20\n", + "23/22 [==============================] - ETA: -4s - loss: 0.4229 - accuracy: 0.8142\n", + "Epoch 00019: val_accuracy did not improve from 0.86667\n", + "22/22 [==============================] - 320s 14s/step - loss: 0.4229 - accuracy: 0.8142 - val_loss: 0.3341 - val_accuracy: 0.8564 - lr: 2.0000e-05\n", + "Epoch 20/20\n", + "23/22 [==============================] - ETA: -4s - loss: 0.4193 - accuracy: 0.8142\n", + "Epoch 00020: val_accuracy did not improve from 0.86667\n", + "22/22 [==============================] - 323s 14s/step - loss: 0.4193 - accuracy: 0.8142 - val_loss: 0.3644 - val_accuracy: 0.8359 - lr: 2.0000e-05\n" + ] + } + ], + "source": [ + "from loader_picture import data_loader\n", + "import numpy as np\n", + "from matplotlib import pyplot as plt\n", + "\n", + "from train_model.modeling import reduce_study_rate\n", + "from train_model.modeling import modeling\n", + "from train_model.data_gen import data_output\n", + "\n", + "# 载入图片\n", + "load = data_loader.Loader()\n", + "# 获取模型\n", + "models = modeling.breast_train_test()\n", + "# 展现模型\n", + "models.model.summary()\n", + "# data\n", + "data = data_output.gen_data()\n", + "\n", + "# 降低学习率\n", + "reduces = reduce_study_rate.reduce()\n", + "reduces.train()\n", + "\n", + "# 训练+评估\n", + "history = models.model.fit(\n", + " data.tr_gen.flow(load.train_of_x , load.train_of_y , batch_size=data.batch),\n", + " steps_per_epoch = load.train_of_x.shape[0] / data.batch,\n", + " # 训练20次\n", + " epochs=20,\n", + " validation_data=(load.val_of_x , load.val_of_y),\n", + " callbacks=[reduces.learn_control , reduces.checkpoint]\n", + ")" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": 6, + "outputs": [ + { + "data": { + "text/plain": "" + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "text/plain": "
", + "image/png": "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" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import pandas as pd\n", + "\n", + "history_df = pd.DataFrame(history.history)\n", + "history_df[['accuracy', 'val_accuracy']].plot()" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": 128, + "outputs": [], + "source": [ + "# import tensorflow as tf\n", + "# -*- coding: utf-8 -*-\n", + "import tensorflow.compat.v1 as tf\n", + "tf.disable_v2_behavior()\n", + "tf.disable_eager_execution()" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": 101, + "outputs": [], + "source": [ + "sess = tf.compat.v1.Session()" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": 74, + "outputs": [], + "source": [ + "def load_pb_model(sess, save_path):\n", + " with open(save_path) as f:\n", + " print(f.encoding)" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": 75, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "cp936\n" + ] + } + ], + "source": [ + "load_pb_model(sess , 'D:\\\\pro_of_program\\\\Python\\\\train_cancer\\\\train_model\\\\models\\\\saved_model.pb')" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": 116, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(647, 224, 224, 3)\n" + ] + } + ], + "source": [ + "tf.compat.v1.disable_eager_execution()\n", + "x = load.x_test.copy()\n", + "print(load.x_test.shape)" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": 132, + "outputs": [], + "source": [ + "path1 = 'D:\\\\pro_of_program\\\\Python\\\\train_cancer\\\\train_model\\\\models'\n", + "path2 = 'D:\\\\pro_of_program\\\\Python\\\\train_cancer\\\\train_model\\\\models\\\\keras_metadata.pb'" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": 148, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "WARNING:tensorflow:From D:\\Python 3.11\\Lib\\site-packages\\keras\\src\\layers\\normalization\\batch_normalization.py:883: _colocate_with (from tensorflow.python.framework.ops) is deprecated and will be removed in a future version.\n", + "Instructions for updating:\n", + "Colocations handled automatically by placer.\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING:tensorflow:From D:\\Python 3.11\\Lib\\site-packages\\keras\\src\\layers\\normalization\\batch_normalization.py:883: _colocate_with (from tensorflow.python.framework.ops) is deprecated and will be removed in a future version.\n", + "Instructions for updating:\n", + "Colocations handled automatically by placer.\n" + ] + } + ], + "source": [ + "x = tf.keras.models.load_model('train_model/models')" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": 149, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + } + ], + "source": [ + "print(x)" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": 151, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Model: \"sequential\"\n", + "_________________________________________________________________\n", + " Layer (type) Output Shape Param # \n", + "=================================================================\n", + " densenet201 (Functional) (None, 7, 7, 1920) 18321984 \n", + " \n", + " global_average_pooling2d ( (None, 1920) 0 \n", + " GlobalAveragePooling2D) \n", + " \n", + " dropout (Dropout) (None, 1920) 0 \n", + " \n", + " batch_normalization (Batch (None, 1920) 7680 \n", + " Normalization) \n", + " \n", + " dense (Dense) (None, 2) 3842 \n", + " \n", + "=================================================================\n", + "Total params: 18333506 (69.94 MB)\n", + "Trainable params: 18100610 (69.05 MB)\n", + "Non-trainable params: 232896 (909.75 KB)\n", + "_________________________________________________________________\n" + ] + } + ], + "source": [ + "x.summary()" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": 153, + "outputs": [], + "source": [ + "y = x.predict(load.x_test)" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": 154, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[6.0920877e-09 1.0000000e+00]\n", + " [9.9891126e-01 1.0887930e-03]\n", + " [9.9357092e-01 6.4291358e-03]\n", + " ...\n", + " [9.9998343e-01 1.6547259e-05]\n", + " [9.6453744e-01 3.5462592e-02]\n", + " [9.9991632e-01 8.3681123e-05]]\n" + ] + } + ], + "source": [ + "print(y)" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": 164, + "outputs": [], + "source": [ + "with open('test_res.txt' , 'w') as f:\n", + " for i in y:\n", + " f.write(str(float(i[0])))\n", + " f.write(' ')\n", + " f.write(str(float(i[1])))\n", + " f.write('\\n')" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": 162, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.0001\n" + ] + } + ], + "source": [ + "temp = 1e-4\n", + "print(temp)" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": 12, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(1, 224, 224, 3)\n" + ] + } + ], + "source": [ + "import numpy as np\n", + "from loader_picture import data_single_loader\n", + "pic = 'D:\\\\pro_of_program\\\\Python\\\\train_cancer\\\\picture\\\\malignant\\\\malignant (209).png'\n", + "img = data_single_loader.load_single(pic , 224)\n", + "img = np.expand_dims(img , axis=0)" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": 15, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1/1 [==============================] - 2s 2s/step\n" + ] + } + ], + "source": [ + "import tensorflow as tf\n", + "x = tf.keras.models.load_model('train_model/models')\n", + "res = x.predict(img)" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": 18, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[1.4167277e-06 9.9999857e-01]]\n" + ] + } + ], + "source": [ + "print(res)" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": 1, + "outputs": [ + { + "ename": "NameError", + "evalue": "name 'img' is not defined", + "output_type": "error", + "traceback": [ + "\u001B[1;31m---------------------------------------------------------------------------\u001B[0m", + "\u001B[1;31mNameError\u001B[0m Traceback (most recent call last)", + "Cell \u001B[1;32mIn[1], line 3\u001B[0m\n\u001B[0;32m 1\u001B[0m \u001B[38;5;28;01mimport\u001B[39;00m \u001B[38;5;21;01mtensorflow\u001B[39;00m \u001B[38;5;28;01mas\u001B[39;00m \u001B[38;5;21;01mtf\u001B[39;00m\n\u001B[0;32m 2\u001B[0m x \u001B[38;5;241m=\u001B[39m tf\u001B[38;5;241m.\u001B[39mkeras\u001B[38;5;241m.\u001B[39mmodels\u001B[38;5;241m.\u001B[39mload_model(\u001B[38;5;124m'\u001B[39m\u001B[38;5;124mtrain_model/models\u001B[39m\u001B[38;5;124m'\u001B[39m)\n\u001B[1;32m----> 3\u001B[0m res \u001B[38;5;241m=\u001B[39m x\u001B[38;5;241m.\u001B[39mpredict(\u001B[43mimg\u001B[49m)\n", + "\u001B[1;31mNameError\u001B[0m: name 'img' is not defined" + ] + } + ], + "source": [], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": 2, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1/1 [==============================] - 2s 2s/step\n", + "[[0.91666824 0.08333173]]\n" + ] + } + ], + "source": [ + "import numpy as np\n", + "from loader_picture import data_single_loader\n", + "import tensorflow as tf\n", + "\n", + "pic1 = 'D:\\\\pro_of_program\\\\Python\\\\train_cancer\\\\picture\\\\normal\\\\normal (1).png'\n", + "img1 = data_single_loader.load_single(pic1 , 224)\n", + "img1 = np.expand_dims(img1 , axis=0)\n", + "\n", + "x = tf.keras.models.load_model('train_model/models')\n", + "res = x.predict(img1)\n", + "print(res)" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": 2, + "outputs": [ + { + "ename": "NotImplementedError", + "evalue": "in user code:\n\n File \"D:\\pro_of_program\\Python\\train_cancer\\loader_picture\\data_loader.py\", line 20, in __init__ *\n self.benign_train = np.array(self.data_loader('D:\\\\pro_of_program\\\\Python\\\\train_cancer\\\\picture\\\\benign', 224))\n\n NotImplementedError: Cannot convert a symbolic tf.Tensor (PartitionedCall:0) to a numpy array. This error may indicate that you're trying to pass a Tensor to a NumPy call, which is not supported.\n", + "output_type": "error", + "traceback": [ + "\u001B[1;31m---------------------------------------------------------------------------\u001B[0m", + "\u001B[1;31mNotImplementedError\u001B[0m Traceback (most recent call last)", + "Cell \u001B[1;32mIn[2], line 10\u001B[0m\n\u001B[0;32m 7\u001B[0m \u001B[38;5;28;01mfrom\u001B[39;00m \u001B[38;5;21;01mtrain_model\u001B[39;00m\u001B[38;5;21;01m.\u001B[39;00m\u001B[38;5;21;01mdata_gen\u001B[39;00m \u001B[38;5;28;01mimport\u001B[39;00m data_output\n\u001B[0;32m 9\u001B[0m \u001B[38;5;66;03m# 载入图片\u001B[39;00m\n\u001B[1;32m---> 10\u001B[0m load \u001B[38;5;241m=\u001B[39m \u001B[43mdata_loader\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mLoader\u001B[49m\u001B[43m(\u001B[49m\u001B[43m)\u001B[49m\n\u001B[0;32m 11\u001B[0m \u001B[38;5;66;03m# 获取模型\u001B[39;00m\n\u001B[0;32m 12\u001B[0m models \u001B[38;5;241m=\u001B[39m modeling\u001B[38;5;241m.\u001B[39mbreast_train_test()\n", + "File \u001B[1;32mD:\\Python 3.11\\Lib\\site-packages\\tensorflow\\python\\util\\traceback_utils.py:153\u001B[0m, in \u001B[0;36mfilter_traceback..error_handler\u001B[1;34m(*args, **kwargs)\u001B[0m\n\u001B[0;32m 151\u001B[0m \u001B[38;5;28;01mexcept\u001B[39;00m \u001B[38;5;167;01mException\u001B[39;00m \u001B[38;5;28;01mas\u001B[39;00m e:\n\u001B[0;32m 152\u001B[0m filtered_tb \u001B[38;5;241m=\u001B[39m _process_traceback_frames(e\u001B[38;5;241m.\u001B[39m__traceback__)\n\u001B[1;32m--> 153\u001B[0m \u001B[38;5;28;01mraise\u001B[39;00m e\u001B[38;5;241m.\u001B[39mwith_traceback(filtered_tb) \u001B[38;5;28;01mfrom\u001B[39;00m \u001B[38;5;28;01mNone\u001B[39;00m\n\u001B[0;32m 154\u001B[0m \u001B[38;5;28;01mfinally\u001B[39;00m:\n\u001B[0;32m 155\u001B[0m \u001B[38;5;28;01mdel\u001B[39;00m filtered_tb\n", + "File \u001B[1;32m~\\AppData\\Local\\Temp\\__autograph_generated_filevpn6c1g1.py:8\u001B[0m, in \u001B[0;36mouter_factory..inner_factory..tf____init__\u001B[1;34m(self)\u001B[0m\n\u001B[0;32m 6\u001B[0m \u001B[38;5;28;01mdef\u001B[39;00m \u001B[38;5;21mtf____init__\u001B[39m(\u001B[38;5;28mself\u001B[39m):\n\u001B[0;32m 7\u001B[0m \u001B[38;5;28;01mwith\u001B[39;00m ag__\u001B[38;5;241m.\u001B[39mFunctionScope(\u001B[38;5;124m'\u001B[39m\u001B[38;5;124m__init__\u001B[39m\u001B[38;5;124m'\u001B[39m, \u001B[38;5;124m'\u001B[39m\u001B[38;5;124mfscope\u001B[39m\u001B[38;5;124m'\u001B[39m, ag__\u001B[38;5;241m.\u001B[39mConversionOptions(recursive\u001B[38;5;241m=\u001B[39m\u001B[38;5;28;01mTrue\u001B[39;00m, user_requested\u001B[38;5;241m=\u001B[39m\u001B[38;5;28;01mTrue\u001B[39;00m, optional_features\u001B[38;5;241m=\u001B[39m(), internal_convert_user_code\u001B[38;5;241m=\u001B[39m\u001B[38;5;28;01mTrue\u001B[39;00m)) \u001B[38;5;28;01mas\u001B[39;00m fscope:\n\u001B[1;32m----> 8\u001B[0m ag__\u001B[38;5;241m.\u001B[39mld(\u001B[38;5;28mself\u001B[39m)\u001B[38;5;241m.\u001B[39mbenign_train \u001B[38;5;241m=\u001B[39m \u001B[43mag__\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mconverted_call\u001B[49m\u001B[43m(\u001B[49m\u001B[43mag__\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mld\u001B[49m\u001B[43m(\u001B[49m\u001B[43mnp\u001B[49m\u001B[43m)\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43marray\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43m(\u001B[49m\u001B[43mag__\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mconverted_call\u001B[49m\u001B[43m(\u001B[49m\u001B[43mag__\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mld\u001B[49m\u001B[43m(\u001B[49m\u001B[38;5;28;43mself\u001B[39;49m\u001B[43m)\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mdata_loader\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43m(\u001B[49m\u001B[38;5;124;43m'\u001B[39;49m\u001B[38;5;124;43mD:\u001B[39;49m\u001B[38;5;130;43;01m\\\\\u001B[39;49;00m\u001B[38;5;124;43mpro_of_program\u001B[39;49m\u001B[38;5;130;43;01m\\\\\u001B[39;49;00m\u001B[38;5;124;43mPython\u001B[39;49m\u001B[38;5;130;43;01m\\\\\u001B[39;49;00m\u001B[38;5;124;43mtrain_cancer\u001B[39;49m\u001B[38;5;130;43;01m\\\\\u001B[39;49;00m\u001B[38;5;124;43mpicture\u001B[39;49m\u001B[38;5;130;43;01m\\\\\u001B[39;49;00m\u001B[38;5;124;43mbenign\u001B[39;49m\u001B[38;5;124;43m'\u001B[39;49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[38;5;241;43m224\u001B[39;49m\u001B[43m)\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[38;5;28;43;01mNone\u001B[39;49;00m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mfscope\u001B[49m\u001B[43m)\u001B[49m\u001B[43m,\u001B[49m\u001B[43m)\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[38;5;28;43;01mNone\u001B[39;49;00m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mfscope\u001B[49m\u001B[43m)\u001B[49m\n\u001B[0;32m 9\u001B[0m ag__\u001B[38;5;241m.\u001B[39mld(\u001B[38;5;28mself\u001B[39m)\u001B[38;5;241m.\u001B[39mmalignant_train \u001B[38;5;241m=\u001B[39m ag__\u001B[38;5;241m.\u001B[39mconverted_call(ag__\u001B[38;5;241m.\u001B[39mld(np)\u001B[38;5;241m.\u001B[39marray, (ag__\u001B[38;5;241m.\u001B[39mconverted_call(ag__\u001B[38;5;241m.\u001B[39mld(\u001B[38;5;28mself\u001B[39m)\u001B[38;5;241m.\u001B[39mdata_loader, (\u001B[38;5;124m'\u001B[39m\u001B[38;5;124mD:\u001B[39m\u001B[38;5;130;01m\\\\\u001B[39;00m\u001B[38;5;124mpro_of_program\u001B[39m\u001B[38;5;130;01m\\\\\u001B[39;00m\u001B[38;5;124mPython\u001B[39m\u001B[38;5;130;01m\\\\\u001B[39;00m\u001B[38;5;124mtrain_cancer\u001B[39m\u001B[38;5;130;01m\\\\\u001B[39;00m\u001B[38;5;124mpicture\u001B[39m\u001B[38;5;130;01m\\\\\u001B[39;00m\u001B[38;5;124mmalignant\u001B[39m\u001B[38;5;124m'\u001B[39m, \u001B[38;5;241m224\u001B[39m), \u001B[38;5;28;01mNone\u001B[39;00m, fscope),), \u001B[38;5;28;01mNone\u001B[39;00m, fscope)\n\u001B[0;32m 10\u001B[0m ag__\u001B[38;5;241m.\u001B[39mld(\u001B[38;5;28mself\u001B[39m)\u001B[38;5;241m.\u001B[39mmalignant_test \u001B[38;5;241m=\u001B[39m ag__\u001B[38;5;241m.\u001B[39mconverted_call(ag__\u001B[38;5;241m.\u001B[39mld(np)\u001B[38;5;241m.\u001B[39marray, (ag__\u001B[38;5;241m.\u001B[39mconverted_call(ag__\u001B[38;5;241m.\u001B[39mld(\u001B[38;5;28mself\u001B[39m)\u001B[38;5;241m.\u001B[39mdata_loader, (\u001B[38;5;124m'\u001B[39m\u001B[38;5;124mD:\u001B[39m\u001B[38;5;130;01m\\\\\u001B[39;00m\u001B[38;5;124mpro_of_program\u001B[39m\u001B[38;5;130;01m\\\\\u001B[39;00m\u001B[38;5;124mPython\u001B[39m\u001B[38;5;130;01m\\\\\u001B[39;00m\u001B[38;5;124mtrain_cancer\u001B[39m\u001B[38;5;130;01m\\\\\u001B[39;00m\u001B[38;5;124mpicture\u001B[39m\u001B[38;5;130;01m\\\\\u001B[39;00m\u001B[38;5;124mmalignant\u001B[39m\u001B[38;5;124m'\u001B[39m, \u001B[38;5;241m224\u001B[39m), \u001B[38;5;28;01mNone\u001B[39;00m, fscope),), \u001B[38;5;28;01mNone\u001B[39;00m, fscope)\n", + "\u001B[1;31mNotImplementedError\u001B[0m: in user code:\n\n File \"D:\\pro_of_program\\Python\\train_cancer\\loader_picture\\data_loader.py\", line 20, in __init__ *\n self.benign_train = np.array(self.data_loader('D:\\\\pro_of_program\\\\Python\\\\train_cancer\\\\picture\\\\benign', 224))\n\n NotImplementedError: Cannot convert a symbolic tf.Tensor (PartitionedCall:0) to a numpy array. This error may indicate that you're trying to pass a Tensor to a NumPy call, which is not supported.\n" + ] + } + ], + "source": [ + "from loader_picture import data_loader\n", + "import numpy as np\n", + "from matplotlib import pyplot as plt\n", + "\n", + "from train_model.modeling import reduce_study_rate\n", + "from train_model.modeling import modeling\n", + "from train_model.data_gen import data_output\n", + "\n", + "# 载入图片\n", + "load = data_loader.Loader()\n", + "# 获取模型\n", + "models = modeling.breast_train_test()\n", + "# 展现模型\n", + "models.model.summary()\n", + "# data\n", + "data = data_output.gen_data()\n", + "\n", + "# 降低学习率\n", + "reduces = reduce_study_rate.reduce()\n", + "reduces.train()\n", + "\n", + "# 训练+评估\n", + "history = models.model.fit(\n", + " generator=data.tr_gen.flow(load.train_of_x , load.train_of_y , batch_size=data.batch),\n", + " steps_per_epoch = 40,\n", + " # 训练20次\n", + " epochs=50,\n", + " validation_data=(load.val_of_x , load.val_of_y),\n", + " callbacks=[reduces.learn_control , reduces.checkpoint]\n", + ")" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": 3, + "outputs": [], + "source": [ + "from loader_picture import data_loader" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": 4, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(853, 224, 224, 3)\n" + ] + }, + { + "data": { + "text/plain": "" + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data_loader.Loader()" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": 1, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1/1 [==============================] - 3s 3s/step\n" + ] + } + ], + "source": [ + "import numpy as np\n", + "from loader_picture import data_single_loader\n", + "import tensorflow as tf\n", + "\n", + "pic_test = 'D:\\\\pro_of_program\\\\Python\\\\train_cancer\\\\picture\\\\benign\\\\benign (331).png'\n", + "# 转换为numpy格式\n", + "img_test = data_single_loader.load_single(pic_test , 224)\n", + "# 需要(1,224,224,3)这种格式输入\n", + "img_test = np.expand_dims(img_test , axis=0)\n", + "\n", + "# 载入模型\n", + "x = tf.keras.models.load_model('train_model/third_model')\n", + "res = x.predict(img_test)" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": 3, + "outputs": [], + "source": [ + "np.set_printoptions(suppress=True)" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": 4, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.99984765\n" + ] + } + ], + "source": [ + "print(res[0][0])" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": 1, + "outputs": [ + { + "ename": "SyntaxError", + "evalue": "unmatched ')' (1947326207.py, line 16)", + "output_type": "error", + "traceback": [ + "\u001B[1;36m Cell \u001B[1;32mIn[1], line 16\u001B[1;36m\u001B[0m\n\u001B[1;33m return \"良性:\" + str(res[0][0]) + \"恶性:\" + str(res[0][1]))\u001B[0m\n\u001B[1;37m ^\u001B[0m\n\u001B[1;31mSyntaxError\u001B[0m\u001B[1;31m:\u001B[0m unmatched ')'\n" + ] + } + ], + "source": [ + "import numpy as np\n", + "from loader_picture import data_single_loader\n", + "import tensorflow as tf\n", + "\n", + "def check(dir_pic , dir_model):\n", + " pic_test = dir_pic\n", + " # 转换为numpy格式\n", + " img_test = data_single_loader.load_single(pic_test , 224)\n", + " # 需要(1,224,224,3)这种格式输入\n", + " img_test = np.expand_dims(img_test , axis=0)\n", + "\n", + " # 载入模型\n", + " x = tf.keras.models.load_model(dir_model)\n", + " res = x.predict(img_test)\n", + " np.set_printoptions(suppress=True)\n", + " return \"良性:\" + str(res[0][0]) + \"恶性:\" + str(res[0][1]))" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": 2, + "outputs": [], + "source": [], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [], + "metadata": { + "collapsed": false + } + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/src/medicine/train_cancer/思路整理.md b/src/medicine/train_cancer/思路整理.md new file mode 100644 index 00000000..e31614eb --- /dev/null +++ b/src/medicine/train_cancer/思路整理.md @@ -0,0 +1,49 @@ +#### *第一步、搜集数据集* + +- *文件保存在picture文件夹中* + - *benign 良性乳腺癌图片* + - *malignant 恶性乳腺癌图片* + - *normal 正常乳腺癌图片* +- *以70%作为训练集、30%作为测试集* + +#### *第二步、处理数据集* + +- *(1) 读取图片* +- *(2) 使用sklearn.model_selection中的train_test_split 分割数据集* +- *(3) 使用plt打印图片* + +#### *第三步训练* +- *训练模型选择* + - *使用Microsoft提出的DenseNet201框架进行训练* + - *DenseNet201包含201层卷积层和全连接层* + - *拥有池化操作,非常适合训练模型* + +- *激活函数选择* + - *使用softmax作为激活函数* + + - $$ + Softmax(z_{i} )=\frac{e^{z_{i}}}{ {\textstyle \sum_{c=1}^{c} e^{z_{c}}}} + 其中zi为第i个节点的输出值,c为输出节点的个数 + $$ + +- *损失函数选择* + + - *使用二元交叉熵给出* + + - $$ + Loss = \frac{1}{N} \sum_{i=1}^{N}[y_{i}log(p(y_{i})) + (1-y_{i})(1 - log(p(y_{i})))] + $$ + +- *优化器选择* + + - *Nadam优化器* + - *该优化器综合Adam将RMSprop和动量结合起来* + - *优于Adam优化器* + +#### *第四步*测试 + +- *导入图片* + - *使用PIL进行读取图片* + - *使用test pic进行测试* + - *tensorflow load_model进行模型的加载* + - *predict进行模型的预测* \ No newline at end of file