真的很难理解keras中卷积1d 层的输入维度:
输入形状
具有形状的3D张量:(样本,步骤,input_dim).
输出形状
具有形状的3D张量:(samples,new_steps,nb_filter).由于填充,步骤值可能已更改.
我希望我的网络采用价格的时间序列(按顺序排列101)并输出4个概率.我当前的非卷积网络做得相当好(训练集为28000)看起来像这样:
standardModel = Sequential()
standardModel.add(Dense(input_dim=101, output_dim=100, W_regularizer=l2(0.5), activation='sigmoid'))
standardModel.add(Dense(4, W_regularizer=l2(0.7), activation='softmax'))
Run Code Online (Sandbox Code Playgroud)
为了改善这一点,我想从输入层创建一个特征映射,该映射具有长度为10的本地接收字段(因此具有10个共享权重和1个共享偏差).然后,我想使用最大池并将其馈入40个左右神经元的隐藏层,然后在外层输出4个带有softmax的神经元.
理想情况下,卷积层将采用2d张量维度:
(minibatch_size,101)
并输出3d张量的尺寸
(minibatch_size,91,no_of_featuremaps)
但是,keras层似乎需要输入中称为step的维度.我已经尝试了解这一点,但仍然没有完全理解.在我的情况下,步骤为1,因为向量中的每个步骤都是1的时间增加?另外,new_step是什么?
另外,如何将汇集层的输出(3d张量)转换为适合标准隐藏层(即密集keras层)的输入,形式为2d张量?
更新:在给出非常有用的建议之后,我尝试制作一个卷积网络,如下所示:
conv = Sequential()
conv.add(Convolution1D(64, 10, input_shape=(1,101)))
conv.add(Activation('relu'))
conv.add(MaxPooling1D(2))
conv.add(Flatten())
conv.add(Dense(10))
conv.add(Activation('tanh'))
conv.add(Dense(4))
conv.add(Activation('softmax'))
Run Code Online (Sandbox Code Playgroud)
conv.Add(Flatten())行抛出一个超出有效边界误差的范围.有趣的是,这个代码不会引发此错误:
conv = Sequential()
conv.add(Convolution1D(64, 10, input_shape=(1,101)))
conv.add(Activation('relu'))
conv.add(MaxPooling1D(2))
conv.add(Flatten())
Run Code Online (Sandbox Code Playgroud)
干
print conv.input_shape
print conv.output_shape
Run Code Online (Sandbox Code Playgroud)
结果是
(None, 1, 101
(None, -256)
Run Code Online (Sandbox Code Playgroud)
被退回
更新2:
变
conv.add(Convolution1D(64, 10, input_shape=(1,101)))
Run Code Online (Sandbox Code Playgroud)
至
conv.add(Convolution1D(10, 10, input_shape=(101,1))
Run Code Online (Sandbox Code Playgroud)
它开始工作了.但是,输入(无,101,1)到1d转换层或(无,1,101)之间是否有任何重要的区别?为什么(无,1,101)不起作用?
无论如何都要明确地施放/胁迫
sbyte[]或byte[]到bool[] char[]到short[]/ushort[]在CIL你经常会看到诸如此类的东西
stelem Type sbyte (ldloc pArray) ldc_i4 1 ldc_i4 0
Run Code Online (Sandbox Code Playgroud)
在pArray[1] = true哪里做的pArray是一维类型的数组bool[].我想在c#中复制这个
(sbyte[])pArray[1] = 1;
Run Code Online (Sandbox Code Playgroud)
不幸的是,C#编译器不允许这样做.
我目前正在使用httplistener authenticationselector委托进行Windows身份验证和ip检查,它的工作非常出色,因为它拒绝并允许应有的客户端。
但是,问题在于,当有人被拒绝时,他们会收到403 http响应,这似乎被大多数浏览器解释为黑屏。我想做的是发回一条消息,说“访问被拒绝:您的IP已被列入白名单”。
这可能吗?
下面是该代表的摘要(目前可以正常运行)。
AuthenticationSchemeSelector pIPChecker = pRequest =>
{
if (!pfunIPChecker(pRequest.RemoteEndPoint.Address))
{
LogHelper.writeToEventLog(
"WARNING, BANNED IP: " + pRequest.RemoteEndPoint.Address.MapToIPv4().ToString() + "attempted to login",
EventLogEntryType.Warning,
LogHelper.EventLogID.PermissionFailure);
return AuthenticationSchemes.None;
}
return AuthenticationSchemes.Anonymous;
}
Run Code Online (Sandbox Code Playgroud) 我们最近在我们的解决方案上运行了 csproj 迁移工具,包含 156 个项目:
dotnet tool install --global Project2015To2017.Migrate2019.Tool
Run Code Online (Sandbox Code Playgroud)
尽管我们必须做一些修改,但效果非常好。然而,它引起了一个问题,即更改前后分支之间的切换会导致 assemblyinfo 出现问题。
错误是:
Duplicate 'global::System.Runtime.Versioning.TargetFrameworkAttribute' attribute [PROJECTNAME]
Run Code Online (Sandbox Code Playgroud)
我相信这是因为新格式放置了 assemblyinfo.cs 而旧式 csproj 不知何故选择了它?您可以在此处看到文件出现问题的地方:
PROJECTNAMEe\obj\x64\Debug\.NETFramework,Version=v4.7.2.AssemblyAttributes.cs
Run Code Online (Sandbox Code Playgroud)
这可以通过运行来修复:
1. Close Visual studio/Rider
2. git clean -xfd
3. Get-ChildItem . -Include obj, .vs -Recurse -force | Remove-Item -Recurse -Force
4. Rebuild solution
Run Code Online (Sandbox Code Playgroud)
现在这可行了,但令人恼火的是我们必须不断提醒自己这样做。有没有办法修改我们的新csprojs以使其不这样做?
如果你有一个Type of Type Array而不是一个特定的数组类型,比如int [],那么如何生成一个表达式,该表达式可以快速获取长度,而无需执行整个属性获取malarkay.
例如在下面
ParameterExpression para3 = Expression.Parameter(typeof(int[]), "p3");
ParameterExpression para4 = Expression.Parameter(typeof(Array), "p4");
Type pt1 = para3.Type.GetElementType();
Type pt2 = para4.Type.GetElementType();
MethodInfo mArrayLength = Strong.Instance<Array>.Property<int>(a => a.Length).GetGetMethod();
Expression asdf5 = Expression.ArrayLength(para3);
Expression asdf6 = Expression.ArrayLength(para4);
Expression asdf7 = Expression.Call(para4, mArrayLength);
Run Code Online (Sandbox Code Playgroud)
mArrayLength只是Array类型的Length属性的get方法.
这里的表达式为asdf5,因为para5的类型为int [],但asdf6 不起作用,因为para6的类型只是Array类型.asdf7确实有效.
我想要的是有效地使用ldlen指令,它只需要一个Object,而不是调用一个方法.这仅仅是表达式树库的限制吗?
您可以使用反射编辑该字段,甚至可以编译表达式!但是尝试运行委托将导致操作可能破坏运行时异常的稳定性.
Array parr = new int[5];
Expression pArraylength = Expression.ArrayLength(para3);
pOperandFieldInfo.SetValue(pArraylength, para4);
Expression<Func<Array, int>> pexchanger = (Expression<Func<Array, int>>)Expression.Lambda(pArraylength, para4);
Func<Array, int> pFunc = pexchanger.Compile();
int pint = pFunc(parr);
Run Code Online (Sandbox Code Playgroud)